【问题标题】:String to LocalDate字符串到 LocalDate
【发布时间】:2012-02-03 11:43:56
【问题描述】:

如何将字符串转换为LocalDate

我见过这样的例子:

LocalDate dt = new LocalDate("2005-11-12");

但我的字符串是这样的:

2005-nov-12

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    您可能必须从 DateTime 转到 LocalDate。

    使用 Joda 时间:

    DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
    DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
    LocalDate localDate = dateTime.toLocalDate();
    

    【讨论】:

    • 请注意,此答案指的是 Joda,而不是 Java SE。
    【解决方案2】:

    DateTimeFormatter 具有可直接用于解析字符序列的内置格式。它是区分大小写的,11 月将起作用,但是 nov 和 十一月不会工作:

    DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
    
    try {
        LocalDate datetime = LocalDate.parse(oldDate, pattern);
        System.out.println(datetime); 
    } catch (DateTimeParseException e) {
        // DateTimeParseException - Text '2019-nov-12' could not be parsed at index 5
        // Exception handling message/mechanism/logging as per company standard
    }
    

    DateTimeFormatterBuilder 提供自定义方式来创建格式化程序。它不区分大小写, Nov 、 nov 和 NOV 将被视为相同。

    DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
            .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
    try {
        LocalDate datetime = LocalDate.parse(oldDate, f);
        System.out.println(datetime); // 2019-11-12
    } catch (DateTimeParseException e) {
         // Exception handling message/mechanism/logging as per company standard
    }
    

    【讨论】:

    • 欢迎来到 SO,我们感谢您的意见!请编辑您的答案并提供更多解释,它与问题的关系,您从哪里获得解决方案,为什么它有效?如需更多指导,请参阅stackoverflow.com/help/how-to-answer
    【解决方案3】:

    当你使用 Joda Time 时,你应该使用DateTimeFormatter:

    final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
    final LocalDate dt = dtf.parseLocalDate(yourinput);
    

    如果使用 Java 8 或更高版本,请参考hertzi's answer

    【讨论】:

    • 还提交了格式“yyyy-MMM-dd”的编辑。 YYYY 是时代的年份,并且(更令人震惊的)DD 是一年中的日子。
    • 答案有点错误......对于joda时间,要使用的类是DateTimeFormat,而不是DateTimeFormatter。也就是说,调用 DateTimeFormat.ofPattern("yyyy-MM-dd").parseLocalDate(yourInput);
    【解决方案4】:

    java.time

    从 Java 1.8 开始,您无需额外的库即可通过使用 java.time 类实现此目的。见Tutorial

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
    formatter = formatter.withLocale( putAppropriateLocaleHere );  // Locale specifies human language for translating, and cultural norms for lowercase/uppercase and abbreviations and such. Example: Locale.US or Locale.CANADA_FRENCH
    LocalDate date = LocalDate.parse("2005-nov-12", formatter);
    

    虽然语法几乎相同。

    【讨论】:

    • java.time.format.DateTimeParseException:无法在索引 5 处解析文本“2005-nov-12”
    • 发生这种情况是因为您的默认语言环境要求 'Nov' 的 'N' 为大写。
    • 请参阅my Answer 到一个类似的问题,以了解有关此方法的更多讨论。
    【解决方案5】:

    日期时间格式由org.joda.time.format.DateTimeFormatter class 执行。三个类提供创建格式化程序的工厂方法,这是一个。其他的是ISODateTimeFormatDateTimeFormatterBuilder

    DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MMM-dd");
    LocalDate lDate = new LocalDate().parse("2005-nov-12",format);
    

    final org.joda.time.LocalDate class 是一个不可变的日期时间类,表示一个日期没有时区LocalDate线程安全且不可变的,前提是年表也是如此。提供的所有标准 Chronology 类都是线程安全且不可变的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多