Format tanggal Java - termasuk karakter tambahan

88

Apakah ada yang setara dengan format gaya tanggal () php di Java? Maksud saya, di php saya bisa karakter backslash-escape agar diperlakukan secara harfiah. Yyyy \ y \ e \ a \ r akan menjadi tahun 2010 . Saya tidak menemukan yang serupa di Java, semua contoh hanya berurusan dengan format tanggal bawaan.

Secara khusus, saya berurusan dengan pemilih tanggal JCalendar dan properti dateFormatString mereka .

Saya membutuhkannya karena di lokal saya diperlukan untuk menulis segala macam hal tambahan dalam format tanggal, seperti d. (untuk hari) setelah berpisah hari, m. (selama bertahun-tahun) setelah bertahun-tahun berpisah dan seterusnya. Pada kasus terburuk saya bisa menggunakan string replace atau regexp tetapi mungkin ada cara yang lebih sederhana? Terima kasih sebelumnya!

Sejanus
sumber
1
Bagi siapa pun yang membaca ini pada 2019 atau lebih baru, SimpleDateFormatkelas yang digunakan dalam beberapa jawaban terkenal merepotkan dan sudah lama usang. Hindari itu. Sebagai gantinya gunakan jawaban singkat dari Mark Jeronimus yang mendemonstrasikan penggunaan java.time, API tanggal dan waktu Java modern .
Ole VV

Jawaban:

165

Tentu, dengan SimpleDateFormat Anda dapat menyertakan string literal:

Dalam string pola tanggal dan waktu, huruf yang tidak dikutip dari 'A' hingga 'Z' dan dari 'a' hingga 'z' diartikan sebagai huruf pola yang mewakili komponen string tanggal atau waktu. Teks dapat dikutip menggunakan tanda kutip tunggal (') untuk menghindari interpretasi. "''" mewakili satu kutipan. Semua karakter lainnya tidak diinterpretasikan; mereka hanya disalin ke dalam string keluaran selama pemformatan atau dicocokkan dengan string masukan selama penguraian.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Thilo
sumber
Super, itulah yang saya butuhkan. Anehnya saya belum menemukan hal yang sederhana seperti itu dalam banyak contoh yang saya lihat di web :) Terima kasih banyak!
Sejanus
1
Bagaimana cara keluar dari karakter kutipan? Saya mencoba melakukan sesuatu dengan format mm '. Menunjukkan misalnya 46 menit seperti 46 '.
Sotti
3
@Sotti: 46''. Yang pertama lolos dari yang kedua.
Thilo
1
FYI, kelas tanggal-waktu yang sangat merepotkan seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian.
Basil Bourque
24

Sekadar kelengkapan, Java 8 DateTimeFormatterjuga mendukung ini:

DateTimeFormatter.ofPattern("yyyy 'year'");
Mark Jeronimus
sumber
6

Anda dapat menggunakan String.format seperti yang didokumentasikan di java.util.Formatter :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
R Samuel Klatchko
sumber
6

java.time

Mark Jeronimus sudah mengatakannya . Saya menyempurnakannya sedikit lagi. Letakkan saja teks yang akan dicetak secara harfiah di dalam tanda kutip tunggal.

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

Output saat berjalan barusan:

2010 year
2010 year
2019 year

Jika Anda menggunakan a DateTimeFormatterBuilderdan appendPatternmetodenya, gunakan tanda kutip tunggal dengan cara yang sama. Atau gunakan appendLiteralmetodenya sebagai gantinya dan tidak ada tanda kutip tunggal.

Lalu, bagaimana kita memasukkan kutipan tunggal dalam format? Dua tanda kutip tunggal menghasilkan satu. Tidak masalah apakah tanda kutip tunggal ganda ada di dalam tanda kutip tunggal atau tidak:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

Pukul 02:00 Waktu Musim Panas Pasifik

Semua pemformat di atas juga dapat digunakan untuk parsing. Sebagai contoh:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56

The SimpleDateFormatkelas digunakan ketika pertanyaan ini diminta hampir 10 tahun yang lalu ini sangat merepotkan dan lama usang. Saya merekomendasikan bahwa sebagai gantinya Anda menggunakan java.time, API tanggal dan waktu Java modern. Itulah mengapa saya mendemonstrasikan hal itu.

Tautan

Ole VV
sumber
-4

java.text.SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 
String formattedDate = formatter.format(date);

Anda akan mendapatkan info lebih lanjut di sini teks tautan

Javi
sumber