Ciąg do LocalDate

102

Jak mogę zamienić ciąg na ciąg LocalDate?

Widziałem przykłady takie jak:

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

Ale moje struny są takie:

2005-nov-12
clankill3r
źródło

Odpowiedzi:

78

Używając Joda Time, powinieneś używać DateTimeFormatter:

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

Jeśli używasz Java 8 lub nowszej, zapoznaj się z odpowiedzią hertzi

fge
źródło
Przesłano również zmianę w formacie „rrrr-MMM-dd”. RRRR to rok ery, a (bardziej skandalicznie) DD to dzień roku.
Spencer Kormos,
odpowiedź jest nieco zła ... w przypadku czasu joda klasą do użycia jest DateTimeFormat, a nie DateTimeFormatter. Innymi słowy, wywołaj DateTimeFormat.ofPattern ("yyyy-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood,
188

java.time

Od wersji Java 1.8 można to osiągnąć bez dodatkowej biblioteki, używając klas java.time . Zobacz samouczek .

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);

Jednak składnia jest prawie taka sama.

hertzi
źródło
java.time.format.DateTimeParseException: nie można przeanalizować tekstu „2005-lis-12” w indeksie 5
Atte Juvonen
3
Dzieje się tak, ponieważ domyślne ustawienie regionalne oczekuje, że „N” z „Lis” będzie pisane dużymi literami.
hertzi
Zobacz moją odpowiedź na podobne pytanie, aby uzyskać więcej informacji na temat tego podejścia.
Basil Bourque
14

Może być konieczne przejście z DateTime do LocalDate.

Korzystanie z czasu Joda:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
źródło
2
Zauważ, że ta odpowiedź odnosi się do Jody, a nie Java SE.
DavidS
9

Formatowanie daty i godziny jest wykonywane przez org.joda.time.format.DateTimeFormatter class. Trzy klasy zapewniają metody fabryczne do tworzenia elementów formatujących , a to jest jedna. Pozostali to ISODateTimeFormati DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classjest niezmienną klasą datetime reprezentującą datę bez strefy czasowej . LocalDatejest bezpieczny dla wątków i niezmienny , pod warunkiem, że chronologia jest również. Wszystkie dostarczane standardowe klasy chronologii są bezpieczne dla wątków i niezmienne.

Chandra Sekhar
źródło
1

DateTimeFormatter ma wbudowane formaty, których można bezpośrednio użyć do przeanalizowania sekwencji znaków. Jest rozróżniana wielkość liter, listopad zadziała, ale listopad i listopad nie będą działać:

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
}

DateTimeFormatterBuilderzapewnia niestandardowy sposób tworzenia programu formatującego. Bez rozróżniania wielkości liter, listopad, listopad i listopad będą traktowane tak samo.

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
}
Prashant Singh Chouhan
źródło
1
Witamy w SO, doceniamy Twój wkład! Edytuj swoją odpowiedź i podaj trochę więcej wyjaśnień, jak to się ma do pytania, skąd masz rozwiązanie, dlaczego działa? Aby uzyskać więcej wskazówek, zobacz stackoverflow.com/help/how-to-answer
B - rian