8

我想解析这样的日期字符串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-30LocalDateTime (具有默认时间)?

4

3 回答 3

7

正如@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()

于 2016-01-09T23:18:38.837 回答
4

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

而不是使用 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);

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

于 2018-04-24T15:50:30.003 回答
1

尽管已有答案,为什么我还是写了这个答案

不幸的是,所有现有的答案都只是部分正确。它们缺少现代日期时间 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 的更多信息。

于 2020-08-19T10:59:11.167 回答