我从源系统以以下字符串格式获取具有偏移时间值的日期时间内容。
2019-02-16T10:00:00 + 08:00
我想使用偏移值将其转换为本地日期时间。我尝试了以下操作,但未获得预期的结果。
DateTime date = new DateTime("2019-02-16T10:00:00+08:00");
->输出== 2019-02-16T02:00:00.000Z (小时减少而不是增加)
DateTime date = new DateTime("2019-02-16T10:00:00-08:00");
->输出== 2019-02-16T18:00:00.000Z (小时数增加而不是减少)。
有没有简单的方法可以达到预期的输出? 注意:我正在使用Java 1.7
答案 0 :(得分:2)
您在做什么是正确的。要获取您当地时区的时间:
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
(发音为“ Zulu”)表示UTC,因此也可以写为Z
。
如果您尚未绑定Joda-Time,则可能更喜欢使用现代Java日期和时间API java.time。代码类似:
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 6 。我已经在jdk1.7.0_79上运行了上面的代码。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 1 :(得分:-1)
另一种方法:
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