Saya tahu ini akan memberi saya hari bulan sebagai angka ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Tetapi bagaimana Anda memformat hari dalam bulan untuk memasukkan indikator ordinal , katakanlah 11th
, 21st
atau 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
sumber
sumber
SimpleDateFormat
kelas. Ini tidak hanya lama ketinggalan jaman, juga terkenal merepotkan. Hari ini kita memiliki jauh lebih baikjava.time
, API tanggal dan waktu Jawa modern danDateTimeFormatter
.Jawaban:
Tabel dari @kaliatech bagus, tetapi karena informasi yang sama diulang, itu membuka peluang untuk bug. Bug seperti itu sebenarnya ada dalam tabel untuk
7tn
,,17tn
dan27tn
(bug ini mungkin diperbaiki seiring berjalannya waktu karena sifat cair StackOverflow, jadi periksa riwayat versi pada jawaban untuk melihat kesalahannya).sumber
Tidak ada dalam JDK untuk melakukan ini.
Atau menggunakan Kalender:
Per komentar oleh @ thorbjørn-ravn-andersen, tabel seperti ini dapat membantu ketika melokalisasi:
sumber
sumber
java.lang.IllegalArgumentException
karena "karakter pola ilegal, t."Pertanyaan sudah agak tua. Seperti pertanyaan ini sangat berisik sehingga memposting apa yang saya lakukan diselesaikan dengan metode statis sebagai util. Cukup salin, tempel, dan gunakan!
Untuk pengujian purose
Contoh: memanggilnya dari metode utama!
Keluaran:
sumber
sumber
Saya ingin berkontribusi pada jawaban modern. The
SimpleDateFormat
kelas adalah OK untuk digunakan ketika pertanyaan itu ditanyakan 8 tahun yang lalu, tetapi Anda harus menghindari sekarang karena tidak hanya lama usang, tetapi juga terkenal merepotkan. Gunakanjava.time
sebagai gantinya.Edit
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
bagus untuk tujuan ini. Menggunakannya kami membangun formatter yang berfungsi untuk kami:Output dari snippet ini adalah:
Jawaban lama
Kode ini lebih pendek, tetapi IMHO tidak begitu elegan.
Menjalankan potongan ini sekarang
Salah satu dari banyak fitur
java.time
adalah bahwa itu mudah dan dapat diandalkan untuk mendapatkan hari bulan sebagaiint
, yang jelas diperlukan untuk memilih akhiran yang tepat dari tabel.Saya sarankan Anda juga menulis unit test.
PS Sebuah formatter yang sama juga dapat digunakan untuk parsing string tanggal yang berisi nomor urut seperti
1st
,2nd
, dll Itu dilakukan dalam pertanyaan ini: Java - date Parse dengan detik opsional .Tautan: Tutorial Oracle: Tanggal Waktu menjelaskan cara menggunakan
java.time
.sumber
Jika Anda mencoba untuk menyadari i18n solusinya menjadi lebih rumit.
Masalahnya adalah bahwa dalam bahasa lain suffix tidak hanya bergantung pada nomor itu sendiri, tetapi juga pada kata benda yang diperhitungkan. Misalnya dalam bahasa Rusia "2-ой день", tetapi "2-ая неделя" (ini berarti "hari ke-2", tetapi "minggu ke-2"). Ini tidak berlaku jika kita memformat hanya beberapa hari, tetapi dalam kasus yang sedikit lebih umum Anda harus menyadari kompleksitas.
Saya pikir solusi yang bagus (saya tidak punya waktu untuk benar-benar menerapkan) akan memperluas SimpleDateFormetter untuk menerapkan MessageFormat lokal sadar sebelum melewati ke kelas induk. Dengan cara ini Anda dapat mendukung katakanlah untuk format Maret% M untuk mendapatkan "3-rd",% MM untuk mendapatkan "03-rd" dan% MMM untuk mendapatkan "ketiga". Dari luar kelas ini terlihat seperti SimpleDateFormatter biasa, tetapi mendukung lebih banyak format. Juga jika pola ini secara tidak sengaja diterapkan oleh SimpleDateFormetter biasa hasilnya akan diformat secara salah, tetapi masih dapat dibaca.
sumber
Banyak contoh di sini tidak akan berfungsi untuk 11, 12, 13. Ini lebih umum dan akan bekerja untuk semua kasus.
sumber
Saya tidak dapat puas dengan jawaban yang menyerukan solusi hanya dalam bahasa Inggris berdasarkan format manual. Saya sudah mencari solusi yang tepat untuk sementara waktu sekarang dan akhirnya saya menemukannya.
Anda harus menggunakan RuleBasedNumberFormat . Ini berfungsi dengan baik dan menghormati Lokal.
sumber
Ada cara yang lebih sederhana dan pasti untuk melakukan ini. Fungsi yang harus Anda gunakan adalah getDateFromDateString (dateString); Ini pada dasarnya menghapus st / nd / rd / th dari string tanggal dan hanya menguraikannya. Anda dapat mengubah SimpleDateFormat Anda menjadi apa saja dan ini akan berhasil.
}
sumber
Satu-satunya masalah dengan solusi yang disediakan oleh Greg adalah bahwa itu tidak memperhitungkan angka lebih besar dari 100 dengan angka "remaja" berakhir. Misalnya, 111 harus 111, bukan 111. Ini solusi saya:
sumber
th
untuk 11, 12 dan 13 sebagaimana mestinya. Saya percayaif ( hunRem - tenRem == 10 )
kasus ini memastikan demikian.RuleBasedNumberFormat
di perpustakaan ICUSaya menghargai tautan ke perpustakaan proyek ICU dari @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), namun masih harus mencari tahu cara menggunakannya, jadi contoh
RuleBasedNumberFormat
penggunaannya di bawah ini.Ini hanya akan memformat angka tunggal daripada seluruh tanggal, jadi Anda perlu membuat string gabungan jika mencari tanggal dalam format: Senin 3 Februari, misalnya.
Kode di bawah ini mengatur
RuleBasedNumberFormat
sebagai format Ordinal untuk Lokal yang diberikan, membuatjava.time ZonedDateTime
, dan kemudian memformat angka dengan ordinalnya menjadi string.Contoh output:
Atau
dll.
sumber
Berikut adalah pendekatan yang memperbarui pola DateTimeFormatter dengan akhiran sufiks yang benar jika menemukan pola
d'00'
, misalnya untuk hari bulan 1 itu akan diganti dengand'st'
. Setelah polanya diperbarui, baru kemudian dapat dimasukkan ke DateTimeFormatter untuk melakukan sisanya.Itu memang mengharuskan pola asli diperbarui sebelum setiap panggilan pemformatan, misalnya
Jadi ini berguna jika pola format didefinisikan di luar kode Java, misalnya templat, di mana seolah-olah Anda dapat menentukan pola di Jawa maka jawabannya oleh @ OleV.V. mungkin lebih tepat
sumber
Saya menulis diri saya metode penolong untuk mendapatkan pola untuk ini.
dan kemudian kita bisa menyebutnya sebagai
outputnya adalah
sumber
Coba fungsi di bawah ini:
sumber
Date
,Calendar
danSimpleDateFormat
. Kelas-kelas itu dirancang dengan buruk dan sudah lama ketinggalan jaman, yang terakhir khususnya terkenal menyusahkan. Alih-alih menggunakanLocalDate
danDateTimeFormatter
, keduanya dari java.time, API tanggal dan waktu Java modern . Saya juga ragu apa yang baru kontribusi Anda dibandingkan dengan 18 jawaban lainnya?Di kotlin Anda bisa menggunakan seperti ini
atur seperti ini
sumber
Metode berikut dapat digunakan untuk mendapatkan string yang diformat dari tanggal yang dilewatkan ke dalamnya. Ini akan memformat tanggal untuk mengatakan 1, 2, 3, 4 .. menggunakan SimpleDateFormat di Jawa. misalnya: - 1 September 2015
sumber
Berikut ini adalah jawaban yang lebih efisien untuk pertanyaan daripada mengkodekan gaya.
Untuk mengubah hari ke nomor urut, Anda perlu menggunakan akhiran berikut .
Temukan jawaban lengkap saya dalam pertanyaan ini .
sumber
sumber