gpt4 book ai didi

java - 解析作为查询参数传递给 REST API 的不同日期的标准方法是什么?

转载 作者:行者123 更新时间:2023-12-02 01:54:08 24 4
gpt4 key购买 nike

我正在开发一个 REST API,它支持日期作为查询参数。由于它是查询参数,因此它将是字符串。现在可以在 QueryParams 中以以下格式发送日期:

yyyy-mm-dd[(T| )HH:MM:SS[.fff]][(+|-)NNNN] 

这意味着以下是有效日期:

2017-05-05 00:00:00.000+0000
2017-05-05 00:00:00.000
2017-05-05T00:00:00
2017-05-05+0000
2017-05-05

现在,为了解析所有这些不同的日期时间,我正在使用 Java8 datetime api。代码如下所示:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd[[ ][['T'][ ]HH:mm:ss[.SSS]][Z]"))
.toFormatter();
LocalDateTime localDateTime = null;
LocalDate localDate = null;
ZoneId zoneId = ZoneId.of(ZoneOffset.UTC.getId());
Date date = null;

try {
localDateTime = LocalDateTime.parse(datetime, formatter);
date = Date.from(localDateTime.atZone(zoneId).toInstant());
} catch (Exception exception) {
System.out.println("Inside Excpetion");
localDate = LocalDate.parse(datetime, formatter);
date = Date.from(localDate.atStartOfDay(zoneId).toInstant());
}

从代码中可以看出,我正在使用 DateTimeFormatter 并附加一个模式。现在我首先尝试在 try-block 中将日期解析为 LocalDateTime ,如果它在 2017-05-05 等情况下抛出异常由于没有时间过去,我在 catch block 中使用 LocalDate

上述方法为我提供了我正在寻找的解决方案,但我的问题是,这是处理作为字符串发送的日期的标准方法吗?我的方法是否符合这些标准?

另外,如果可能的话,我可以解析不同类型的日期(如上面的有效日期所示)的其他方法是什么,除了一些其他简单的解决方案,例如使用数组列表并放置所有可能的格式,然后使用 for 循环尝试解析日期?

最佳答案

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
// time is optional
.optionalStart()
.parseCaseInsensitive()
.appendPattern("[ ]['T']")
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.optionalEnd()
// offset is optional
.appendPattern("[xx]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
.toFormatter();
for (String queryParam : new String[] {
"2017-05-05 00:00:00.000+0000",
"2017-05-05 00:00:00.000",
"2017-05-05T00:00:00",
"2017-05-05+0000",
"2017-05-05",
"2017-05-05T11:20:30.643+0000",
"2017-05-05 16:25:09.897+0000",
"2017-05-05 22:13:55.996",
"2017-05-05t02:24:01"
}) {
Instant inst = OffsetDateTime.parse(queryParam, formatter).toInstant();
System.out.println(inst);
}

此代码段的输出是:

2017-05-05T00:00:00Z
2017-05-05T00:00:00Z
2017-05-05T00:00:00Z
2017-05-05T00:00:00Z
2017-05-05T00:00:00Z
2017-05-05T11:20:30.643Z
2017-05-05T16:25:09.897Z
2017-05-05T22:13:55.996Z
2017-05-05T02:24:01Z

我使用的技巧包括:

  • 可选部分可以包含在模式中的 optionalStart/optionalEnd[] 中。我两种方式都用,我觉得每种方式都更容易阅读,您可能更喜欢不同的方式。
  • 已经有针对日期和时间的预定义格式化程序,因此我重复使用它们。我特别利用了 DateTimeFormatter.ISO_LOCAL_TIME 已经处理可选的秒和秒的小数部分这一事实。
  • 为了解析为 OffsetDateTime 工作,我们需要为查询参数中可能缺少的部分提供默认值。 parseDefaulting 就是这样做的。

在您的代码中,您将转换为日期java.util.Date 类早已过时,并且存在许多设计问题,因此请尽可能避免使用它。 Instant 就可以了。如果您确实需要旧版 API 的日期,而您现在无法更改或不想更改,请按照问题中的相同方式进行转换。

编辑:现在默认为HOUR_OF_DAY,而不是MILLI_OF_DAY。当仅缺少毫秒时,后者会引起冲突,但格式化程序似乎对缺少时间的默认小时感到满意。

关于java - 解析作为查询参数传递给 REST API 的不同日期的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558859/

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