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

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


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.


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

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.


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
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.