我不能使用Joda。当我尝试从表示UTC中的日期或日期时间的字符串创建日期或日历时,生成的对象有一个与其关联的时区…
这是代码:
案例1:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyDDD");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("2012018");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Tue Jan 17 19:00:00 EST 2012 !?!*&#&??
案例2:
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("1202011431");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Wed Feb 01 09:31:00 EST 2012 !?!*&#&??
类型为java.util.Date
的对象是自Epoch以来的绝对时间量。当您从日历创建Date对象时,它会丢失日历可能使用的任何时区,只会给您一个原始时间量。EST并没有真正与Date"关联",只是Date上的toString方法使用JVM默认时区来创建一个可读的表示。
重要的是要理解,在上面的代码示例中使用Calendar完全没有做任何事情。这样只更改时区只会更改日历的可读表示。自epoch以来的原始毫秒数在调用setTime
和getTime
之前和之后是相同的。
(java.util.Date上所有与人类可读表示相关的方法都已弃用,无法正常工作,最好只是假装它们不存在。)
打印时间时,它总是在机器上配置的本地时区中打印,这就是您想要的(以UTC存储和表示日期/时间,并在演示过程中转换为用户特定的时区)。
是的,Java中的日期有一个与之相关的时区。日期上的toString打印本地时区中的日期。如果您不希望这样,请使用DateFormat不显示它。注意,您需要将DateFormat上的时区设置为UTC才能获得所需内容。