如何使用 Instant Java 类解析具有 UTC 偏移量的日期时间?

问题描述

我正在尝试使用具有时区偏移量的 Instant.parse() 解析日期时间。我阅读了文档,它说我必须使用 ISO-8601 来做到这一点。我阅读了维基百科的 ISO-8601 文章,并从那里复制了这个日期时间“2007-11-03T13:18:05-03:00”,并将它与 parse() 方法一起使用。调用抛出异常,表示无法解析参数。我不明白为什么会这样。有人可以帮我吗?

解决方法

tl;博士

OffsetDateTime 
.parse(
    "2007-11-03T13:18:05-03:00"
)
.toInstant()
.toString() 

详情

字符串 -03:00 末尾的 "2007-11-03T13:18:05-03:00" 表示比 UTC 晚三个小时的偏移量。

Instant 类表示在 UTC 时间看到的时刻,偏移量为零时-分-秒。

改用 OffsetDateTime 类。

OffsetDateTime odt = OffsetDateTime.parse( "2007-11-03T13:18:05-03:00" ) ;

要调整为零的偏移量,请提取一个 Instant

Instant instant = odt.toInstant() ;

要生成带有标准 ISO 8601 格式文本的字符串,请调用 toString()

String output = instant.toString() ;

对于带有时区而不仅仅是偏移量的日期时间值,请使用 ZonedDateTime 类。

仅对于日期和时间但缺少偏移量或区域的上下文,请使用 LocalDateTime

,

编辑:正如@Tom 在评论中指出的,从 Java 12 开始,我们可以简单地做:

    System.out.println(Instant.parse("2007-11-03T13:18:05-03:00"));

输出为:

2007-11-03T16:18:05Z

原始答案:另一个选项(Java 版本高达 11)是:

    Instant yourInstant = DateTimeFormatter.ISO_OFFSET_DATE_TIME
            .parse("2007-11-03T13:18:05-03:00",Instant::from);
    System.out.println(yourInstant);

输出和上面一样。

更喜欢哪个?我认为这是一个品味问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...