java - 从具有一位数小时偏移量的字符串中解析日期时间

标签 java date parsing timezone-offset datetime-parsing

我需要用 Java 解析日期。我有字符串值 2018-05-15 09:32:51.550082 +3:00 我需要将其解析为日期时间。我尝试解析为 ZonedDateTime,但在索引 10 处出现错误。尝试使用 DateTimeFormatter 解析器 'yyyy-MM-dd HH:mm:ss.SSSSSS Z 进行解析' 并在索引 26 处出错。显然我的 +3:00 的 UTC 偏移量无法解析。我该怎么做?

最佳答案

Java 9 及更高版本允许:

    String dateTimeString = "2018-05-15 09:32:51.550082 +3:00";
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd HH:mm:ss.SSSSSS ")
            .appendOffset("+H:MM:ss", "+0:00")
            .toFormatter();
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

输出:

2018-05-15T09:32:51.550082+03:00

对于 Java 8 或 ThreeTen Backport,您可能必须在解析之前准备日期时间字符串:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX");
    dateTimeString 
            = dateTimeString.replaceFirst("([+-])(\\d(?::\\d\\d){0,2})$", "$10$2");

其余的和以前一样,给出了相同的结果。 replaceFirst 调用在 +3:00 之间插入一个 0,但前提是时间只有一个数字。正则表达式难以阅读,因此您会更喜欢 Java 9 解决方案。

正如评论中已经讨论的那样,困难的部分是 +3:00 的偏移量。 Java 的内置格式化程序和可用于指定您自己的格式的格式模式字母都需要偏移量中的两位数小时。我使用的 DateTimeFormatterBuilder.appendOffset 方法允许指定有限数量的格式; Java 8 中的 9 种不同格式; Java 9 中的 22。链接:Documentation of appendOffset() .

关于java - 从具有一位数小时偏移量的字符串中解析日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50344734/

相关文章:

PHP:如何解析 JSON 字符串并获取变量?

使用 Mongo CSFLE (mongodb-crypt) 时/tmp 安装为 noexec 时出现 java.lang.UnsatisfiedLinkError

mysql - 将日期格式更改为不同格式

java - 如何在tomcat docker容器中部署多个war?

mysql - 如何按天选择访客数

javascript - angularjs 设置默认日期输入为今天

python - 简化 AND OR bool 表达式

c++ - 解构固定长度二进制/alpha 消息的最快方法是什么?

java - 如何在不使用 url 参数的情况下将参数传递到新选项卡

java - 使用 Eclipse 功能 - 项目文件现在已隐藏?