其他分享
首页 > 其他分享> > 为何JodaTime时区偏移日期时间?

为何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