DateTime(“2019-02-16T10:00:00 + 08:00”)使用偏移值转换为本地日期时间

问题描述 投票:-2回答:2

我使用以下字符串格式获取日期时间内容,并使用源系统的偏移时间值。

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

java datetime timezone-offset date-conversion
2个回答
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,因为Z(发音为“Zulu”)表示UTC。

java.time和ThreeTen Backport

如果您还没有与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 1.7

没问题,java.time只需要至少Java 6.我在jdk1.7.0_79上运行了上面的代码。

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26),现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,现代类的后端(JST 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保从org.threeten.bp导入子包的日期和时间类。

链接


-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
© www.soinside.com 2019 - 2024. All rights reserved.