Рядок для LocalDate


102

Як я можу перетворити рядок у a LocalDate?

Я бачив такі приклади:

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

Але мої струни такі:

2005-nov-12

Відповіді:


78

Використовуючи Joda Time, ви повинні використовувати DateTimeFormatter:

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

Якщо ви використовуєте Java 8 або новішої версії, зверніться до відповіді герци


Також подано редагування формату "yyyy-MMM-dd". РРРР - це рік епохи, а (більш кричуще) DD - день року.
Спенсер Кормос

відповідь трохи невірний ... для часу 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: Текст "2005-nov-12" не вдалося розібрати в індексі 5
Atte Juvonen

3
Це трапляється тому, що ваш локальний код за замовчуванням очікує, що "N" "Nov" буде великим регістром.
герци

Дивіться мій відповідь на подібне запитання для більшого обговорення цього підходу.
Василь Бурк

14

Можливо, вам доведеться перейти від DateTime до LocalDate.

Використання часу Joda:

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. Три класи надають фабричні методи створення форматів , і це один. Інші є ISODateTimeFormatі DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classє незмінним класом дати, що представляє дату без часового поясу . LocalDateє безпечним для ниток і незмінним , за умови, що це також хронологія . Всі стандартні класи хронології, що постачаються, є безпечними для потоків і незмінними.


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надає власний спосіб створення форматера. Це Case Insensitive, листопад, листопад та 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 - Ріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.