我使用以下字符串格式获取日期时间内容,并使用源系统的偏移时间值。
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");
- > 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。
如果您还没有与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(JST-310的ThreeTen)。另一种方法:
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