gpt4 book ai didi

java - 我可以在 DateTimeFormatterBuilder 的格式之间切换吗?

转载 作者:行者123 更新时间:2023-12-02 09:23:05 24 4
gpt4 key购买 nike

我正在使用 DateTimeFormatterBuilder() 来转换我接收的 JSON 数据(注释代码)并将它们转换为两种格式之一。为了决定使用哪种格式,我使用 REGEX 来查找正方形、 [] 、括号(“.*? ”内包含任何内容)的任何实例。选择正确的格式后,我会将新值解析为另一个 JSON 对象。

问题是,我的程序要么没有正确选择要使用的格式(正则表达式和方法错误),要么没有正确格式化(格式错误),不确定是哪种格式,然后发回错误(底部代码),而不是。

但是,这仅适用于带有方括号的数据。不带方括号的数据得到正确处理。我想知道是否有任何解决方案/建议来解决此问题?

// 2018-11-28T13:09:00.2-04:00
def utcDateFormatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
.appendPattern("xxx")
.toFormatter()

// 2018-11-28T13:09:00.528-08:00[America/New_York]
def utcDateFormatterWithZone = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
.appendPattern("xxx'['VV']'")
.toFormatter()


if (json.beginDateTime.find("\\[.*?\\]") == true) {
object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatterWithZone).format(outFormatter))
} else {
object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatter).format(outFormatter))
}

Error: Text '2019-09-26T15:01:07.941-05:00[America/New_York]' could not be parsed, unparsed text found at index 29

最佳答案

这是内置的:DateTimeFormatter.ISO_ZONED_DATE_TIME

这可以更容易地完成。内置 DateTimeFormatter.ISO_ZONED_DATE_TIME 与您的两种格式匹配。

    String stringWithoutZoneId = "2018-11-28T13:09:00.2-04:00";
String stringWithZoneId = "2018-11-28T13:09:00.528-08:00[America/New_York]";

LocalDateTime parsedWithoutZoneId = LocalDateTime.parse(
stringWithoutZoneId, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(parsedWithoutZoneId);
LocalDateTime parsedWithZoneId = LocalDateTime.parse(
stringWithZoneId, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(parsedWithZoneId);

此代码段的输出是:

2018-11-28T13:09:00.200
2018-11-28T13:09:00.528

也使用偏移量

不过,请注意:您确定要忽略字符串中的偏移量吗?通过这些偏移量,字符串代表明确的时间点。通过解析 LocalDateTime 得到的是属于不同未知偏移量的日期时间。我不明白如何可靠地将它们用于任何有用的事情。

考虑解析为ZonedDateTime。 one-arg ZonedDateTIme.parse 甚至可以在没有任何显式格式化程序的情况下执行此操作。然后将这些 ZonedDateTime 直接存储在您的对象中,或者转换为 Instant 并存储它们。 Instant 代表一个时间点。如果您无法更改存储的类型,您可能需要将 ZonedDateTime 转换为 UTC(或其他商定的时区),然后转换为 LocalDateTime。所有这些都是在不知道您的真实需求的情况下说的,所以我可能是错的,只是我认为不是。

您的代码出了什么问题?

@daggett 是正确的:CharSequence.find 返回一个字符串,因此要使 if 语句正常工作,您需要:

    if (json.beginDateTime.find("\\[.*?\\]") != null) {

String 永远不可能等于 true,因此始终选择不带区域的格式化程序。

链接

Documentation of DateTimeFormatter.ISO_ZONED_DATE_TIME

关于java - 我可以在 DateTimeFormatterBuilder 的格式之间切换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531560/

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