【问题标题】:Joda time : How to convert String to LocalDate?Joda time:如何将字符串转换为 LocalDate?
【发布时间】:2011-02-12 21:03:59
【问题描述】:

如何指定格式字符串以单独从字符串转换日期。就我而言,只有日期部分是相关的

将其构造为 DateTime 失败:

String dateString = "2009-04-17";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(dateString);

出现错误java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short

可能是因为我应该改用LocalDate。但是,我没有看到 LocalDate 的任何格式化程序。将String dateString = "2009-04-17"; 转换为LocalDate 的最佳方法是什么(如果这不是正确的表示形式,则为其他)

谢谢...

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    您可能正在寻找LocalDate(Object)。这有点令人困惑,因为它需要一个通用的Object,但文档表明如果你将String 传递给构造函数,它将使用知道如何处理StringConverterManager,例如

    LocalDate myDate = new LocalDate("2010-04-28");
    

    【讨论】:

    • 这肯定是一个可能令人困惑的 Javadoc 条目。
    • 非常感谢您的指点...我有点困惑如何使用 ConverterManager。如何将字符串传递给它?我需要添加部分转换器吗?但它说默认情况下它接受字符串进行部分转换。如果你能举个例子,那会很有帮助..谢谢
    • 对不起,我的回答不够清楚,但看起来你已经明白了。我确实是说final LocalDate myDate = new LocalDate("2010-04-28");
    • 那么这 always 是否需要 'YYYY-MM-DD' 中的字符串格式?还是其他平台需要不同的订单? (我正在尝试验证一个日期字符串:出于我的目的,我总是希望它在 YYYY-MM-DD 中)
    【解决方案2】:

    使用parse(String) 方法。

    LocalDate date = LocalDate.parse("2009-04-17");
    

    【讨论】:

      【解决方案3】:

      使用LocalDate.parse()new LocalDate() 存在一些微妙的错误问题。一个代码 sn-p 值一千字。在 scala repl 的以下示例中,我想以字符串格式 yyyyMMdd 获取本地日期。 LocalDate.parse() 很高兴给我一个 LocalDate 的实例,但它不是正确的(new LocalDate() 具有相同的行为):

      scala> org.joda.time.LocalDate.parse("20120202")
      res3: org.joda.time.LocalDate = 20120202-01-01
      

      我以 yyyyMMdd 格式给出 2016 年 2 月 2 日的日期,然后我返回 20120202 年 1 月 1 日的日期。我在这里很危险:我认为这不是它应该做的。 Joda 使用 'yyyy-MM-dd' 作为默认值,但会隐含地接受没有 '-' 字符的字符串,认为你想要那年的 1 月 1 日?对我来说,这似乎不是一个合理的默认行为。

      鉴于此,在我看来,使用不容易被愚弄的 joda 日期格式化程序是解析字符串的更好解决方案。此外,如果日期格式不是 'yyyy-MM-dd',LocalDate.parse() 应该可能会抛出异常:

      scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
      format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@56826a75
      
      scala> org.joda.time.LocalDate.parse("20120202", format)
      res4: org.joda.time.LocalDate = 2012-02-02
      

      这将导致其他格式失败,因此您不会遇到这种奇怪的错误行为:

      scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd")
      format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@781aff8b
      
      scala> org.joda.time.LocalDate.parse("20120202", format)
      java.lang.IllegalArgumentException: Invalid format: "20120202" is too short
        at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
        at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)
        at org.joda.time.LocalDate.parse(LocalDate.java:179)
        ... 65 elided
      

      这比返回 20120202 年的日期要理智得多。

      【讨论】:

      • Joda 清楚地在 javadocs 中进行了统计:It accepts formats described by the following syntax: date-element = std-date-element | ord-date-element | week-date-element std-date-element = yyyy ['-' MM ['-' dd]] ord-date-element = yyyy ['-' DDD] week-date-element = xxxx '-W' ww ['-' e] 。我认为这是非常理智的行为。
      • 在文档中声明是一回事,我认为给一个大坑'o失败是另一回事
      【解决方案4】:

      在我的例子中,传入的字符串可能是两种格式之一。所以我首先尝试用更具体的格式解析字符串:

      String s = "2016-02-12";
      LocalDateTime ldt;
      try {
          ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm"));
      }
      catch (IllegalArgumentException e) {
          ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd"));
      }
      

      【讨论】:

        【解决方案5】:

        您可以将LocalDate.of 与作为单独参数传递的年、月和日一起使用:

        LocalDate date1 = LocalDate.of(2009, 4, 17);
        LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);
        

        【讨论】:

          【解决方案6】:

          这对我有用:

          LocalDate d1 = LocalDate.parse("2014-07-19");
          LocalDate dNow = LocalDate.now();  // Current date
          

          【讨论】:

          • 这个答案有什么意义?接受的答案更好,代码更简单,也给出了解释。
          猜你喜欢
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2011-06-07
          • 2020-06-24
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多