【问题标题】:How to parse an ISO date with LocalDateTime.parse(...)如何使用 LocalDateTime.parse(...) 解析 ISO 日期
【发布时间】:2016-04-14 11:43:03
【问题描述】:

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

【问题讨论】:

  • 好吧,使用 LocalDate.parse(),然后通过指定您想要的时间将其更改为 LocalDateTime。

标签: java datetime java-time iso localdatetime


【解决方案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 的更多信息。

【讨论】:

    【解决方案2】:

    下面的示例使用了一些幻数,应避免使用 (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) 或 LocalTime.NOON ( 12:00:00)

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

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

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值,通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案3】:

    正如@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. 使用LocalDateTimeatTime()方法设置你的默认时间

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

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多