String ke LocalDate

102

Bagaimana cara mengonversi string menjadi LocalDate?

Saya telah melihat contoh seperti:

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

Tapi senar saya seperti:

2005-nov-12
clankill3r.dll
sumber

Jawaban:

78

Saat Anda menggunakan Joda Time, Anda harus menggunakan DateTimeFormatter:

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

Jika menggunakan Java 8 atau yang lebih baru, lihat jawaban hertzi

fge
sumber
Juga mengirimkan pengeditan untuk format "yyyy-MMM-dd". YYYY adalah tahun era, dan (lebih mengerikan) DD adalah hari dalam tahun.
Spencer Kormos
jawabannya sedikit salah ... untuk joda time, class yang digunakan adalah DateTimeFormat, bukan DateTimeFormatter. Dengan kata lain, panggil DateTimeFormat.ofPattern ("yyyy-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood
188

java.time

Sejak Java 1.8, Anda dapat mencapai ini tanpa perpustakaan tambahan dengan menggunakan kelas java.time . Lihat 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);

Sintaksnya hampir sama.

hertzi
sumber
java.time.format.DateTimeParseException: Teks '2005-nov-12' tidak dapat diurai pada indeks 5
Atte Juvonen
3
Ini terjadi karena Lokal default Anda mengharapkan 'N' dari 'Nov' menjadi huruf besar.
hertzi
Lihat Jawaban saya untuk Pertanyaan serupa untuk pembahasan lebih lanjut tentang pendekatan ini.
Basil Bourque
14

Anda mungkin harus beralih dari DateTime ke LocalDate.

Menggunakan Waktu Joda:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
sumber
2
Perhatikan bahwa jawaban ini mengacu pada Joda, bukan Java SE.
DavidS
9

Pemformatan tanggal waktu dilakukan oleh org.joda.time.format.DateTimeFormatter class. Tiga kelas menyediakan metode pabrik untuk membuat pemformat , dan ini satu. Yang lainnya adalah ISODateTimeFormatdan DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classadalah kelas datetime tetap yang mewakili tanggal tanpa zona waktu . LocalDateadalah benang-aman dan abadi , asalkan Kronologi adalah juga. Semua kelas Kronologi standar yang disediakan aman untuk thread dan tidak dapat diubah.

Chandra Sekhar
sumber
1

DateTimeFormatter memiliki format bawaan yang dapat langsung digunakan untuk mengurai urutan karakter. Ini case Sensitive, Nov akan bekerja namun nov dan NOV tidak akan bekerja:

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
}

DateTimeFormatterBuildermenyediakan cara kustom untuk membuat formatter. Tidak Peka Kasus, Nov, nov dan NOV akan diperlakukan sama.

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
sumber
1
Selamat datang di SO, kami menghargai masukan Anda! Harap edit jawaban Anda dan berikan sedikit lebih banyak penjelasan, bagaimana kaitannya dengan pertanyaan, dari mana Anda mendapatkan solusi, mengapa berhasil? Untuk panduan lebih lanjut lihat stackoverflow.com/help/how-to-answer
B - rian