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

时间:2019-03-01 12:47:04

标签: java datetime timezone-offset date-conversion

我从源系统以以下字符串格式获取具有偏移时间值的日期时间内容。

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

2 个答案:

答案 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

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反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 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