Jodatime converting time zoned date time to millis
有人可以向我解释为什么当我试图获得一个与我自己的区域不同的DateTime的毫秒时,它会让我回到我本地机器的时区的毫秒数? 我希望得到UTC的毫秒数,但我的应用程序的本地设置被设置为EST(即使我实际上在爱尔兰;))
这是代码:
1 2 3 4 5 6 7 8 9 10 | DateTimeFormatter format = DateTimeFormat.mediumDateTime(); DateTime local = new DateTime(); DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC); System.out.println("utc zone =" +utc.getZone()); System.out.println("UTC time:" + utc); long current = utc.getMillis(); System.out.println("current:" + format.print(current)); System.out.println("local:" + format.print(local.getMillis())); |
这是它打印的内容:
1 2 3 4 | utc zone = UTC UTC time: 2013-08-16T13:36:32.444Z current: Aug 16, 2013 9:36:32 AM local: Aug 16, 2013 9:36:32 AM |
目前,我认为它应该具有与UTC时间相同的日期时间?
几点:
-
您无需致电
System.currentTimeMillis() 。 通过这个:
1 | DateTime utc = new DateTime(DateTimeZone.UTC); |
-
当您调用
.getMillis() 时,结果始终为UTC。 将时间表示为不是基于UTC的整数是一个坏主意,而不是Joda Time将提供的内容。 您对本地时区影响毫秒的评估不正确。 -
转换错误是因为您调用
format.print 的方式。 传递整数时,默认行为是使用当前时区,即本地时间。 您可以像这样更改它:
1 | format.withZone(DateTimeZone.UTC).print(current) |
-
但是,如果打算将其打印为日期字符串,为什么还要先打几毫秒呢? 如果您传递原始
DateTime ,则会自动应用其时区信息。
1 2 | format.print(utc) format.print(local) |
放在一起,整个事情看起来像这样:
1 2 3 4 5 6 7 8 9 10 | DateTime local = new DateTime(); DateTime utc = new DateTime(DateTimeZone.UTC); System.out.println("local zone =" + local.getZone()); System.out.println(" utc zone =" + utc.getZone()); DateTimeFormatter format = DateTimeFormat.mediumDateTime(); System.out.println(" local:" + format.print(local)); System.out.println(" utc:" + format.print(utc)); System.out.println("millis:" + utc.getMillis()); |