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



我以下面的字符串格式获取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

最新更新