为何JodaTime时区偏移日期时间?
作者:互联网
当将字符串“ 2017-04-21T17:46:00Z”传递到第一种方法时,所得的格式化日期字符串为“ 06:46 21 Apr 2017”.为什么每小时移动11个小时?输入字符串由JSON中的HTTP服务器应用程序提供.我以为Z后缀指的是祖鲁语,即GMT.
private static final String DATE_TIME_FORMAT = "hh:mm dd MMM yyyy";
public static String formatTimestamp(String dateTimestamp) {
DateTime dateTime = getDateTimeFromTimestamp(dateTimestamp);
DateTimeFormatter fmt = DateTimeFormat.forPattern(DATE_TIME_FORMAT);
return fmt.print(dateTime);
}
private static DateTime getDateTimeFromTimestamp(String dateTimestamp) {
return new DateTime(dateTimestamp);
}
我怀疑它与时区有关,但尚不清楚如何或在哪里.该代码在格林尼治标准时间(GMT)时区在英国的Android设备上运行.
解决方法:
我已经使用Java 7和joda-time 2.7(但不是Android版本)进行了测试
这就是我可以重现该问题的方法:
// changing my default timezone (because I'm not in UK)
DateTimeZone.setDefault(DateTimeZone.forID("Europe/London"));
// calling your method
System.out.println(formatTimestamp("2017-04-21T17:46:00Z"));
输出是
06:46 21 Abr 2017
为了检查出什么问题,我将日期格式更改为:
DATE_TIME_FORMAT2 = "hh:mm a dd MMM yyyy Z z zzzz";
其中的平均值为“ AM或PM”,Z为时区偏移量/ id,z为时区“短”名称,zzzz为时区“长”名称.使用此格式,输出为:
06:46 PM 21 Abr 2017 +0100 BST British Summer Time
因此,创建的日期时间是6PM,比输入早1小时,而不是您想象的11小时(实际上,如果将格式更改为HH而不是hh,则小时数将是18而不是06).
另请注意时区字段:0100 BST英国夏令时.第一部分(0100)表示此日期时间比格林尼治标准时间早一小时,而BST英国夏令时间表示该日期是British’s Daylight Saving Time.
因此,要使输出等于输入,可以有2种选择:
1.将您的默认时区更改为UTC:
DateTimeZone.setDefault(DateTimeZone.UTC);
System.out.println(formatTimestamp("2017-04-21T17:46:00Z"));
输出将是:
05:46 21 Apr 2017
如果要将小时更改为17:46,请更改日期格式,用HH代替hh
2.使用接收DateTimeZone的DateTime构造函数:
private static DateTime getDateTimeFromTimestamp(String dateTimestamp) {
// creates a DateTime in UTC
return new DateTime(dateTimestamp, DateTimeZone.UTC);
}
输出将与替代项1相同,但是在这种情况下,您无需更改默认时区.
对我来说,替代方案2更有意义,因为:
>您无需更改默认时区(这会在应用程序的其他部分造成混乱)
>您已经知道此代码处理的所有日期均为UTC时间(because of the “Z” in the end)
标签:jodatime,android-jodatime,android 来源: https://codeday.me/bug/20191026/1933395.html