我以下面的字符串格式获取DateTime内容,并从源系统中获得偏移时间值。
2019-02-16T10:00:00 08:00
我想使用偏移值将其转换为当地日期。我尝试了以下,但没有获得预期的结果。
DateTime date = new DateTime("2019-02-16T10:00:00+08:00");
-> output == 2019-02-16T02:00:00.000Z (小时减少而不是增加)
DateTime date = new DateTime("2019-02-16T10:00:00-08:00");
-> output == 2019-02-16T18:00:00.000Z (增加小时而不是减小)。
有什么简单的预期输出方法?注意:我正在使用Java 1.7
您正在做的是正确的。要在当地时区获取时间:
DateTime date = new DateTime("2019-02-16T10:00:00+08:00");
DateTime dateTimeInLocalTimeZone = date.withZone(DateTimeZone.getDefault());
System.out.println(dateTimeInLocalTimeZone);
在欧洲/哥本哈根时区的计算机上,我得到了
2019-02-16T03:00:00.000 01:00
如评论中所述,+08:00
是与UTC时间相比的偏移。因此,您的字符串表示与2019-02-16T02:00:00+00:00
相同的时间点。它也可以写为2019-02-16T02:00:00Z
,因为Z
(发音为" Zulu")表示UTC。
Java.Time和Threeten Backport
如果您尚未与Joda Time绑定,则可能更喜欢使用Java。Time,Modern Java日期和时间API。代码相似:
OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-02-16T10:00:00+08:00");
ZonedDateTime dateTimeInLocalTimeZone = sourceDateTime.atZoneSameInstant(ZoneId.systemDefault());
2019-02-16T03:00 01:00 [欧洲/哥本哈根]
问题:我可以在Java 1.7上使用Java.Time?
注意:我正在使用Java 1.7
没有大问题,java。时间至少需要 Java 6 。我已经在JDK1.7.0_79上运行上述代码。
- 在Java 8及以后以及在新的Android设备上(来自API级别26),现代API是内置的。
- 在Java 6和7中获得了三分之一的回向运动,这是现代阶级的后座(JSR 310的Threeten;请参阅底部的链接)。
- 在(较旧的)Android上使用Threeten Backport的Android版本。它叫做三分之一。并确保您从
org.threeten.bp
导入带有子弹的日期和时间类。
链接
- Oracle教程:解释如何使用Java.Time的日期时间。
- Java规范请求(JSR)310,首先描述了
java.time
。 - Threeten Backport Project,
java.time
的Backport到Java 6和7(JSR-310的Threeten)。 - Threetenabp,Threeten Backport的Android Edition
- 问题:如何在Android项目中使用Threetenabp,并具有非常详尽的解释。
做到这一点的另一种方法:
String dt = "2019-02-16T10:00:00+08:00";
ZonedDateTime zd = ZonedDateTime.parse("2019-02-16T10:00:00+08:00");
System.out.println(zd.toLocalDateTime().plusSeconds(zd.getOffset().getTotalSeconds()));
输出
2019-02-16T18:00