Java 日历时区困惑

标签 java calendar timezone

这是我的简单代码:

    String defaultSimpleDateFormatPattern = "MMM dd, yyyy HH:mm:ss";
    TimeZone tzNY = TimeZone.getTimeZone("America/New_York");
    TimeZone tzLos = TimeZone.getTimeZone("America/Los_Angeles");
    String dateToTest = "Jan 03, 2015 23:59:59";
    SimpleDateFormat df = new SimpleDateFormat(defaultSimpleDateFormatPattern);
    Calendar c = Calendar.getInstance();
    c.setTime(df.parse(dateToTest)); 
    c.setTimeZone(tzLos);

    System.out.println(c.getTimeZone());
    System.out.println(c.getTime());        
    System.out.println(df.format(c.getTime()));


    Calendar c1 = Calendar.getInstance();
    c1.setTime(df.parse(dateToTest));        
    c1.setTimeZone(tzNY);

    System.out.println(c1.getTimeZone());
    System.out.println(c1.getTime());
    System.out.println(df.format(c1.getTime()));

    System.out.println(c.after(c1)? "after" : (c.before(c1)? "before" : "equal"));

打印输出是“相等”。那个怎么样?对这个结果有什么解释吗?

最佳答案

这里有两个问题:

  • 您使用的时区 ID 无效(您需要 America/New_York)
  • 您使用尚未设置时区的格式化程序进行解析(因此它将使用默认时区),然后在日历中设置时区...这不会改变所表示的即时时间

所以基本上,您会解析相同的 Date 两次,执行不会影响所表示的 Date 的操作,然后比较两个相等的 Date 值。

如果可能的话,您应该使用 Joda Time 或 java.time 而不是 java.util.Calendar,但如果您确实需要使用它,只需创建两个不同的格式化程序,每个格式化程序对应一个时区。 (如果您确实需要日历,您还需要在日历中设置时区...)

关于Java 日历时区困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31615035/

相关文章:

java - Thymeleaf 从 Spring Data JPA 迭代 Java 8 Stream

java - Android:使用日历比较2个日期

ios - JTAppleCalendar Swift For 循环

java - 在 Java 中验证时区并抛出异常

java - Java中捕获异常的并发排序任务执行器

java - 如何使用旧版本的 hibernate 运行 Spring boot

javascript Date 对象转换本地时区

python - SQLAlchemy DateTime 时区

java - 将可运行的 Java 类导出到 .jar 文件,仅包括必需的依赖项

jQuery 日历 - 突出显示日期