繁体   English   中英

如何使用 LocalDateTime.parse(...) 解析 ISO 日期

[英]How to parse an ISO date with LocalDateTime.parse(...)

我想像这样解析像2011-11-30这样的日期字符串:

LocalDateTime.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE)

但我得到以下异常:

java.time.format.DateTimeParseException: Text '2011-11-30' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor

如果我传递日期时间字符串,一切都会按预期进行:

LocalDateTime.parse("2011-11-30T23:59:59", DateTimeFormatter.ISO_LOCAL_DATE_TIME)

如何将2011-11-30之类的日期解析为 LocalDateTime(具有默认时间)?

正如@JB Nizet 所建议的,以下作品

LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = localDate.atTime(23, 59, 59);
System.out.println(localDateTime); // 2011-11-30T23:59:59

如何将 2011-11-30 之类的日期解析为 LocalDateTime(具有默认时间)?

  1. 首先在LocalDate中解析它
  2. 使用LocalDateTime atTime()方法设置默认时间

注意:使用DateTimeFormatter.ISO_LOCAL_DATE对于parse()是多余的,请参阅API LocalDate#parse()

下面的示例使用了一些幻数,应该避免( 什么是幻数,为什么它不好? )。

而不是使用方法 atTime(hour, minute, second),

    LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDateTime localDateTime = localDate.atTime(23, 59, 59);

您可以使用 LocalTime 常量,例如LocalTime.MAX 、(23:59:59)、 LocalTime.MIN (00:00:00)、 LocalTime.MIDNIGHT (23:59:59) 或LocalTime.NOON (12:00) :00)

    LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);

它有利于可维护性和交叉引用。

尽管已有答案,但为什么我还要写这个答案

不幸的是,所有现有答案都只是部分正确。 它们缺少现代日期时间 API 的以下重要方面:

  1. 解析日期字符串时使用 ISO 格式
  2. 如何将当前时间应用于LocalDateTime的实例以获取具有当前时间的LocalDateTime的新实例

OP发布的问题:

如何将 2011-11-30 之类的日期解析为 LocalDateTime(具有默认时间)?

回答

您的方法有两个问题:

  1. 由于您正在解析日期字符串,因此您应该使用LocalDate#parse而不是LocalDateTime#parse

  2. 由于您的日期字符串已经在 ISO 模式中,因此您无需使用DateTimeFormatter明确指定此模式,因为LocalDate.parse默认使用此模式。

    除了这两个问题之外,您还需要使用LocalDateTime#with将当前时间应用于LocalDateTime的实例,以获取具有当前时间的LocalDateTime的新实例。

     import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class Main { public static void main(String[] args) { // No need to specify DateTimeFormatter as the string is already in ISO format LocalDate date = LocalDate.parse("2011-11-30"); System.out.println(date); // Get LocalDateTime from LocalDate LocalDateTime ldt = date.atStartOfDay() //Convert to LocalDateTime with 00:00.with(LocalTime.now()); //Adjust to current time System.out.println(ldt); } }

    输出:

     2011-11-30 2011-11-30T11:53:39.103150

注意:Trail:Date Time了解有关现代日期时间 API 的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM