如何使用LocalDateTime.parse(...)

时间:2016-01-09 23:02:58

标签: java datetime

我想像这样解析像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(默认时间)?

3 个答案:

答案 0 :(得分:2)

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

"album" : "Move Along", "albumpos" : 1, "artist" : "The All American Rejects", "bitrate" : 128, "duration" : 195, "playing" : true, "position" : 101, "resolvedBy" : "DatabaseResolver", "score" : 1.0, "track" : "Track 01"
  

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

  1. 先在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
  2. 中解析它
  3. 使用LocalDate LocalDateTime方法设置默认时间
  4. 注意:使用atTime()对于DateTimeFormatter.ISO_LOCAL_DATE来说是多余的,请参阅API LocalDate#parse()

答案 1 :(得分:0)

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

而不是使用atTime方法(小时,分钟,秒),

    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);

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

答案 2 :(得分:0)

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

不幸的是,所有现有答案仅部分正确。它们缺少现代日期时间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的新实例。 / p>

    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的信息。