当前位置: 首页 > 知识库问答 >
问题:

是否有方法在构造后确定DateTimeFormatter是仅为日期还是仅为时间?

冯浩旷
2023-03-14

对于Java8的新日期时间库,将字符串解析为日期的方法是使用datetimeformatterlocaldatelocaltimelocaldatetime都有一个静态分析方法,它接受字符串和格式化程序。一个潜在的问题是,如果您的DateTimeFormat不包含时间部分(或者对于DateTime,是一个日期部分),那么即使您的模式匹配,您最终也会得到一个解析错误。

示例

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD");
LocalDateTime dt = LocalDateTime.parse("2016-01-11", formatter);
java.time.format.DateTimeParseException:
Text '2016-01-11' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor
LocalDateTime ldt = LocalDate.parse("2016-01-11", formatter).atStartOfDay());

我的问题是,假设你有一个像这样的通用方法

 public static LocalDateTime getDate(String s, DateTimeFormatter format) {
  ...
  }

是否有一种方法可以通过应用一些默认逻辑来确定需要调用哪个静态解析方法来将字符串强制到LocalDateTime中?例如,如果日期只使用午夜,如果时间只使用今天,等等。

共有1个答案

那开济
2023-03-14

我想你的问题正好相反。您不想确定格式化程序是只使用日期还是日期/时间。您可以根据应该解析的内容和要将结果存储到的内容创建格式化程序。显然,如果您创建了一个不处理时间部分的格式化程序,那么使用它解析为localdatetime是一个错误的概念。

如果需要解析可以以两种格式到达的日期,如“YYYY-MM-DD”“YYYY-MM-DD hh:mm:ss”(带有时间部分),则不是由解析来确定它应该做什么,而是由格式化程序在没有时间的情况下提供默认值。

对于Java Time,这是通过可选部分和默认值来完成的。例如,模式“YYYY-MM-DD[hh:mm:ss]”将能够解析日期字符串(如“2016-01-11”)和日期/时间字符串(如“2016-01-11 20:10:10”)。如果将其存储到localdatetime中,则需要提供默认值,以防没有时间组件。这是通过parsedefaulting(field,value)完成的:这将告诉格式化程序返回该chrono字段的给定默认值(如果尚未设置)。

下面的代码创建了这样一个格式化程序,并将时间部分默认为午夜。

public static void main(String[] args) {
    DateTimeFormatter formatter = 
            new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd[ HH:mm:ss]")
                                          .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                          .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                          .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                          .toFormatter();

    LocalDateTime dt1 = LocalDateTime.parse("2016-01-11", formatter);
    LocalDateTime dt2 = LocalDateTime.parse("2016-01-11 20:10:10", formatter);
}

当然,这个逻辑可以扩展为只解析时间字符串,并将date组件默认为当前日期。

 类似资料:
  • 问题内容: 我从API收到日期字符串,其格式为。 我目前正在使用正则表达式来验证字符串格式,这种方法可以正常工作,但是我可以看到某些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即,例如。 PHP中是否有更好的方法来接收诸如这样的字符串,并确定该日期是否为该格式的有效日期? 问题答案: 您可以为此目的使用类: 测试用例:

  • 我从API接收一个日期字符串,它的格式为。 我目前正在使用正则表达式来验证字符串格式,它工作正常,但是我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。 在PHP中有没有更好的方法来获取字符串,例如,并判断它是否是格式的有效日期?

  • 问题内容: 在这种情况下,我正在读取大约13万条记录,其中包含存储为String字段的日期。一些记录包含空格(空),一些包含这样的字符串:“ dd-MMM- yy”,而另一些包含此“ dd / MM / yyyy”。 我写了这样的方法: 因此,您可能已经发现了问题。 我正在使用try .. catch作为我逻辑的一部分 。最好事先确定String实际上包含某种格式的可解析日期,然后再尝试解析它。

  • 我很难确定这到底是什么。此时,我已经熟悉了方法、构造函数和类声明的样子。这是哪个?为什么它看起来像一个构造函数和一个方法有一个婴儿?

  • 我认为这段代码是错误的,因为jvm可以选择在完成构造函数之前运行。 那么,当构造函数完成时,如何确保另一个线程始终执行?

  • 本文向大家介绍纯javascript判断查询日期是否为有效日期,包括了纯javascript判断查询日期是否为有效日期的使用技巧和注意事项,需要的朋友参考一下 以下内容主要通过js代码给大家介绍,代码比较简单,包含注释,有好的建议欢迎提出。 如下图,当查询条件含有日期时,如“2012-3-4”,查询前校验输入的日期字符串是否为有效的日期 js判断年月日是否一个有效日期 以上代码就是对日期的有效性校