java - 输入日期 Jan 03 但返回 Jan 02,为什么?

标签 java date

public static void main(String[] args) {
    String opDate = "Tue Jan 03 00:00:00 MSK 2006";
    String date = convertDate(opDate, "yyyyMMdd");
            
    System.out.println("opDate: " + opDate);
    System.out.println("date: " + date);
}

public static String convertDate(String opDate, String dateFormat) {
    Date date = new Date();
                                                    //  Mon Jan 02 00:00:00 MSK 2006
    SimpleDateFormat dateParser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
    
    try {
        date = dateParser.parse(opDate);
    } catch (Exception e) {
        System.out.println("exception = " + e.toString());
    }
    
    SimpleDateFormat df = new SimpleDateFormat(dateFormat);
    df.setTimeZone(TimeZone.getTimeZone("Russia/Moscow"));
    String strDate = df.format( date.getTime() );
    
    return strDate.trim();
}

输出:

opDate: Tue Jan 03 00:00:00 MSK 2006

date: 20060102

为什么返回 1 月 2 日?

最佳答案

问题在于获取“俄罗斯/莫斯科”时区。正确的区域信息 ID 是“欧洲/莫斯科”。更改 ID,问题就消失了:

df.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

不幸的是,TimeZone.getTimeZone("random rubbish") 返回 UTC 时区,而不是以某种方式让您知道它已损坏。

关于java - 输入日期 Jan 03 但返回 Jan 02,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888424/

相关文章:

java - 具有 DVD_START_DT 和 DVD_END_DT 覆盖的彭博 API DVD_HIST 请求

java - 格式化 XmlGregorianCalendar 时区问题

java - 为什么在执行 split() 时,数组的第 0 个索引中有 ""且不带分隔符?

php - 将详细字符串转换为 PHP 日期

java - 如何计算两次之间的差异

sql - 获取上个月的第一个和最后一个日期的最简单和最有效的方法是什么?

php - 在PHP中获取日期之前的最后一个星期四

java - Selenium 网络驱动程序 : Unable to locate element

java - 使用 Hibernate 配置 Spring。创建名称为 'usersDao' : Unsatisfied dependency expressed through field 'sessionFactory' 的 bean 时出错