当将字符串“ 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 methodSystem.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时区偏移日期时间?全部内容,希望文章能够帮你解决为何JodaTime时区偏移日期时间?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)