Saya bermain dengan API waktu tanggal baru tetapi ketika menjalankan ini:
public class Test {
public static void main(String[] args){
String dateFormatted = LocalDate.now()
.format(DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateFormatted);
}
}
Ini melempar:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDate.format(LocalDate.java:1685)
at Test.main(Test.java:23)
Saat melihat kode sumber kelas LocalDate, saya melihat:
private int get0(TemporalField field) {
switch ((ChronoField) field) {
case DAY_OF_WEEK: return getDayOfWeek().getValue();
case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + 1;
case DAY_OF_MONTH: return day;
case DAY_OF_YEAR: return getDayOfYear();
case EPOCH_DAY: throw new UnsupportedTemporalTypeException("Invalid field 'EpochDay' for get() method, use getLong() instead");
case ALIGNED_WEEK_OF_MONTH: return ((day - 1) / 7) + 1;
case ALIGNED_WEEK_OF_YEAR: return ((getDayOfYear() - 1) / 7) + 1;
case MONTH_OF_YEAR: return month;
case PROLEPTIC_MONTH: throw new UnsupportedTemporalTypeException("Invalid field 'ProlepticMonth' for get() method, use getLong() instead");
case YEAR_OF_ERA: return (year >= 1 ? year : 1 - year);
case YEAR: return year;
case ERA: return (year >= 1 ? 1 : 0);
}
throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
}
Seperti yang dijelaskan di dokumen:
Metode ini akan membuat pemformat berdasarkan pola huruf dan simbol sederhana seperti yang dijelaskan dalam dokumentasi kelas.
Dan semua huruf ini telah ditentukan .
Jadi mengapa DateTimeFormatter.ofPattern
tidak mengizinkan kami untuk menggunakan beberapa huruf pola?
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfWeek
DateTimeFormatter.ofPattern("HH:mm:ss")
Saya ingin menambahkan detail berikut ke jawaban yang benar dari @James_D:
Latar belakang: Kebanyakan pustaka tanggal dan waktu (
java.util.Calendar
di Java, lihat juga .Net-DateTime atauDate
di JavaScript atauDateTime
di Perl) didasarkan pada konsep tipe temporal unik serbaguna universal (dalam bahasa Jerman ada ungkapan puitis " eierlegende Wollmilchsau "). Dalam desain ini tidak boleh ada bidang yang tidak didukung. Tetapi harganya mahal: Banyak masalah waktu tidak dapat ditangani secara memadai dengan pendekatan yang tidak fleksibel karena sulit untuk tidak mungkin menemukan penyebut yang sama untuk semua jenis objek temporal.JSR-310 telah memilih cara lain , yaitu untuk memungkinkan tipe temporal berbeda yang terdiri dari set khusus tipe bidang built-in yang didukung. Konsekuensi alami adalah tidak setiap bidang yang memungkinkan didukung oleh setiap jenis (dan pengguna bahkan dapat menentukan bidang khusus mereka sendiri). Dimungkinkan juga untuk secara terprogram meminta setiap objek jenis
TemporalAccessor
untuk kumpulan spesifik bidang yang didukung. KarenaLocalDate
kami menemukan:Tidak ada bidang HOUR_OF_DAY yang menjelaskan masalah
UnsupportedTemporalTypeException
. Dan jika kita melihat JSR-310- pemetaan simbol pola ke bidang, kita melihat bahwa simbol H dipetakan ke HOUR_OF_DAY yang tidak didukung:Pemetaan lapangan ini tidak berarti bahwa lapangan tersebut didukung oleh jenis beton. Penguraian terjadi dalam beberapa langkah. Pemetaan lapangan hanyalah langkah pertama. Langkah kedua adalah mem-parsing menjadi objek mentah bertipe
TemporalAccessor
. Dan terakhir, parsing delegasi ke jenis target (di siniLocalDate
:) dan biarkan memutuskan apakah menerima semua nilai bidang dalam objek perantara yang diurai.sumber
Kelas yang tepat bagi saya adalah
ZonedDateTime
yang mencakup Zona Waktu dan Waktu.LocalDate
tidak memiliki informasi Waktu sehingga Anda mendapatkan aUnsupportedTemporalTypeException: Unsupported field: HourOfDay
.Anda dapat menggunakan
LocalDateTime
tetapi kemudian Anda tidak memiliki informasi Zona Waktu jadi jika Anda mencoba mengaksesnya (bahkan dengan menggunakan salah satu pemformat yang telah ditentukan) Anda akan mendapatkanUnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
.sumber