如何使用 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

How can I parse a date like 2011-11-30 to a LocalDateTime (with a default time)?

  1. 先在LocalDate
  2. 中解析
  3. 使用LocalDateTimeatTime()方法设置默认时间

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

下面的示例使用了一些幻数,应该避免 (What is a magic number, and why is it bad?)。

而不是使用方法 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) or LocalTime.NOON (12:00:00)

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

更好的可维护性和交叉引用。

为什么我在已有答案的情况下写了这个答案

不幸的是,所有现有答案都只是部分正确。他们缺乏现代 date-time API 的以下重要方面:

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

OP 发布的问题:

How can I parse a date like 2011-11-30 to a LocalDateTime (with a default time)?

回答

你的方法有两个问题:

  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 了解更多关于现代 date-time API 的信息。 =24=]