我需要一个 java.time 解析器,它可以处理任何有效的 W3C ISO 8601 日期/时间字符串

编程入门 行业动态 更新时间:2024-10-28 13:18:59
本文介绍了我需要一个 java.time 解析器,它可以处理任何有效的 W3C ISO 8601 日期/时间字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时送ChatGPT账号..

似乎没有内置的 java.time 解析器可以处理任何有效的 W3C ISO 8601 日期/时间字符串.

There doesn't seem to be a built-in java.time parser that can handle any valid W3C ISO 8601 date/time string.

它应该返回一个 ZonedDateTime,其中缺失的字段按照 W3C 规范中的规定设置为 0.

It should return a ZonedDateTime, with missing fields set to 0 as specified in the W3C spec.

这似乎是一个很常见的用例,我很惊讶它不是标准库的一部分,而且我想它在库外已经多次解决了.有人有解决方案吗?

This seems to be such a common use case, im surprised its not part of the standard library, and i imagine its been solved multiple times outside the library. Anyone have solutions?

推荐答案

DateTimeFormatterBuilder#parseDefaulting

链接中的示例 W3C ISO 8601 是 OffsetDateTime 而不是 ZonedDateTime.ZonedDateTime 需要时区 ID,例如欧洲/伦敦.此外,JDBC 4.2 支持 OffsetDateTime,而不是 ZonedDateTime.

DateTimeFormatterBuilder#parseDefaulting

The examples in your link, W3C ISO 8601 are OffsetDateTime and not ZonedDateTime. A ZonedDateTime require a timezone ID e.g. Europe/London. Also, JDBC 4.2 supports OffsetDateTime, not ZonedDateTime.

您可以使用 DateTimeFormatterBuilder#parseDefaulting 将您的字符串解析为具有默认值的 OffsetDateTime.

You can use DateTimeFormatterBuilder#parseDefaulting to parse your string into an OffsetDateTime with default values.

演示:

import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate now = LocalDate.now(zoneId);
        
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .appendPattern("uuuu[-MM[-dd]]['T'HH[:mm[:ss[.SSSSSSSSS][.SSSSSSSS][.SSSSSSS][.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]]]][XXX]")
                .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue())
                .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth())
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                .parseDefaulting(ChronoField.NANO_OF_SECOND, 0)     
                .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                .toFormatter(Locale.ENGLISH);
        
        //Test          
        Stream.of(
                    "1997",
                    "1997-07",
                    "1997-07-16",
                    "1997-07-16T19:20+01:00",
                    "1997-07-16T19:20:30+01:00",
                    "1997-07-16T19:20:30.45+01:00"
        ).forEach(s -> System.out.println(OffsetDateTime.parse(s, dtf)));
    }
}

输出:

1997-05-21T00:00Z
1997-07-21T00:00Z
1997-07-16T00:00Z
1997-07-16T19:20+01:00
1997-07-16T19:20:30+01:00
1997-07-16T19:20:30.450+01:00

输出中的 Z 是 时区指示符 用于零时区偏移.它代表祖鲁语并指定 Etc/UTC 时区(时区偏移为 +00:00 小时).

The Z in the output is the timezone designator for zero-timezone offset. It stands for Zulu and specifies the Etc/UTC timezone (which has the timezone offset of +00:00 hours).

了解有关 java.time 的更多信息,现代日期时间 API* 来自 跟踪:日期时间.

Learn more about java.time, the modern date-time API* from Trail: Date Time.

* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport 将大部分 java.time 功能向后移植到 Java 6 &7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ API 可通过 desugaring 和 如何在 Android 项目中使用 ThreeTenABP.

* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.

这篇关于我需要一个 java.time 解析器,它可以处理任何有效的 W3C ISO 8601 日期/时间字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

更多推荐

[db:关键词]

本文发布于:2023-04-30 13:07:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1395101.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:它可以   字符串   日期   时间   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!