首页 > 解决方案 > DateTimeFormatter 解析带有区域偏移量和时区的字符串

问题描述

这个问题听起来可能与 Stackoverflow 上提出的大多数其他问题相似,但我无法弄清楚我的问题。我想将字符串值解析为日期。

字符串日期时间 =“2020 年 10 月 23 日 02:44:58 +1000”

这个问题的解决方法是:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.parseCaseInsensitive();
builder.appendPattern("d MMM yyyy HH:mm[:ss] Z");
DateTimeFormatter dtf = builder.toFormatter();

ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTime, dtf);
Instant instant = zonedDateTime.toInstant();
Date finalDate = Date.from(instant);

如果我想用时区解析日期,而不是像String dateTime = "23 Oct 2020 02:44:58 AEST"那么我需要更改builder.appendPattern("d MMM yyyy HH:mm[:ss] Z"); 从这里提到的大写 Z 到小 z 。

这里的问题是如何使我的解析器足够灵活,以处理时区或偏移值?

笔记。我使用 [ss] 作为秒字段是可选的。根据文档,使用 VV 与 z 类似,而“V”对我不起作用。

标签: javadatetimejava-8zoneddatetimedatetimeformatter

解决方案


您可以将它们作为可选部分添加到格式化程序,就像您对秒部分所做的那样:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    .appendPattern("d MMM yyyy HH:mm[:ss] [Z][z]")
    .toFormatter(Locale.ROOT);

Online demo

[]表示可选部分:如果可以通过括号内的模式成功解析相应的文本,则消耗相应的文本,否则不消耗任何文本并跳过其中的模式。


推荐阅读