这是我的简单代码:
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/