字符串到LocalDate


102

我如何将字符串转换为LocalDate

我看过类似的例子:

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

但是我的字符串像:

2005-nov-12

Answers:


78

使用Joda Time时,应使用DateTimeFormatter

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

如果使用Java 8或更高版本,请参考hertzi的答案


还提交了格式为“ yyyy-MMM-dd”的编辑。YYYY是年份,(更令人惊讶的是)DD是年份。
Spencer Kormos 2012年

答案略有错误...对于joda时间,要使用的类是DateTimeFormat,而不是DateTimeFormatter。换句话说,调用DateTimeFormat.ofPattern(“ yyyy-MM-dd”)。parseLocalDate(yourInput);
丹·海伍德

188

java.time

从Java 1.8开始,您可以使用java.time类而无需额外的库来实现此目的。请参阅教程

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年11月12日”
Atte Juvonen

3
发生这种情况是因为您的默认语言环境期望“ Nov”的“ N”为大写。
hertzi 2013年

有关此方法的更多讨论,请参见对类似问题的回答
罗勒·布尔克

14

您可能必须从DateTime转到LocalDate。

使用乔达时间:

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

2
请注意,此答案针对的是Joda,而不是Java SE。
DavidS,

9

日期时间格式由进行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是不可变的datetime类,表示不带时区的日期。LocalDate线程安全的并且是不变的,前提是Chronology也是如此。提供的所有标准Chronology类都是线程安全的并且是不可变的。


1

DateTimeFormatter 具有内置格式,可以直接用于解析字符序列。这是区分大小写的,Nov将起作用,而nov和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
}

1
欢迎使用SO,感谢您的投入!请编辑您的答案并提供更多解释,它与问题如何相关,从何处获得解决方案,为什么有效?有关更多指导,请参阅stackoverflow.com/help/how-to-answer
B--rian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.