gpt4 book ai didi

Java 8 DateTime API 在模式和值都未知时解析日期字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:53 27 4
gpt4 key购买 nike

我需要使用同样未知但提供的日期时间格式来解析未知的日期时间字符串。我想解析为 ZonedDateTime。 如果模式字符串中不包含时区,我想假定为 UTC 时区。问题是,我不确定如何确定模式字符串是否包含时区信息,以便在创建 DateTimeFormatter 时可以附加 .withZone(ZoneOffset.UTC) .应该怎么做?

String dateTimeFormat = "yyyy-MM-dd HH:mm:ss Z"; // this will be unknown (could be any possible valid pattern)
String dateTimeValue = "2001-01-01 00:00:00 -0800"; // this will also be unknown

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormat);
if(????) { // how to determine if the pattern contains timezone information
dateTimeFormatter = dateTimeFormatter.withZone(ZoneOffset.UTC);
}

ZonedDateTime dateTime = ZonedDateTime.parse(dateTimeValue, dateTimeFormatter);

最佳答案

您的示例格式模式对于 DateTimeFormatter 不正确类(class)。例如大写的 YYYY 表示基于周的年份,这不太可能是发件人的意图。 DD 表示一年中的第几天 (1-366),同样不太可能是发件人的意图。

DateTimeFormatter 格式化代码

您将需要了解在此类字符串中传递给您的代码。然后,您将需要转换为 DateTimeFormatter 使用的正确格式模式代码。类。

DateTimeFormatterBuilder

您可能会受益于使用非常灵活和强大的 DateTimeFormatterBuilder类,您可以在其中通过多次调用建立格式。在所有必要的调用之后,您最终通过调用 DateTimeFormatterBuilder::toFormatter 生成一个 DateTimeFormatter .

Search Stack Overflow有关使用此类的示例。

其他问题

how to determine if the pattern string contains timezone information

传递的格式化代码中的 Z 告诉您。

I can append .withZone(ZoneOffset.UTC)

如果您尝试调整为 UTC,请将输入字符串解析为日期时间对象后执行此操作。要获取 UTC,只需调用 toInstant,因为根据定义,Instant 始终采用 UTC。

I'm not adjusting to UTC, I want to set the zone as UTC if there is no zone specified in the pattern.

如果您的输入字符串缺少任何时区指示符或与 UTC 的偏移量,则解析为 LocalDateTime .该类故意缺少任何时区或与 UTC 的偏移量的概念。因此,LocalDateTime 代表一个时刻,不是时间轴上的一个点。

如果您确定没有区域/偏移的字符串确实是针对特定区域/偏移的,那么:

OffsetDateTimeZonedDateTime ,你现在有一个时刻,一个时间点。

zone 和 offset 有什么区别?偏移量仅仅是小时-分钟-秒的数字,仅此而已。相比之下,区域要多得多。区域是特定区域的人们使用的偏移的过去、现在和 future 变化的历史。

LocalDateTime ldt = LocalDateTime.parse( "2018-01-23T01:23:45.123" ) ;  // *Not* a moment, *not* a point on the timeline.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Assign an offset to determine a moment.

您似乎过分关注将解析作为应用业务逻辑的一种方式。相反,使您的解析尽可能简单和直接 以获得与输入匹配的 java.time 对象。只有在 解析之后,您才应该对日期时间值进行调整或转换。最后,将此解析和转换代码与其他业务逻辑工作分开,因此您有三个不同的阶段:(1) 简单/直接解析,(2) 调整/转换值,(3) 将日期时间值用于业务目的。

ISO 8601

您的这个项目充满了风险。对别人使用他们自己发明的格式化代码的任意字符串输入负责是我拒绝做的事情。成功或失败是你无法控制的,因为你可能永远不会完全知道会发生什么。

更明智的方法是将负担转移到传入数据的来源。他们应该以标准 ISO 8601 传递您的字符串格式。该标准正是为此目的而设计的,将日期时间值作为文本进行交换。标准格式经过巧妙设计,明确无误,易于机器解析,也易于跨文化的人类阅读。

java.time 类在解析/生成字符串时默认使用标准 ISO 8601 格式。 ZonedDateTime 类通过在方括号中附加时区名称来明智地扩展标准。如果发送分区值,我会建议您的数据源也这样做——通常最好只交换 UTC 值。

关于Java 8 DateTime API 在模式和值都未知时解析日期字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53730707/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com