Apa cara terbaik untuk mengubah String
dalam format '2 Januari 2010' ke dalam Date
di Jawa?
Pada akhirnya, saya ingin membagi bulan, hari, dan tahun sebagai bilangan bulat sehingga saya bisa menggunakannya
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
untuk mengubah tanggal menjadi waktu.
Date
sudah usang.java.util.Date
,java.util.Calendar
, danjava.text.SimpleTextFormat
sekarang warisan , digantikan oleh java.time kelas. Lihat Tutorial oleh Oracle .Jawaban:
Itu cara yang sulit, dan
java.util.Date
metode-metode setter telah ditinggalkan sejak Java 1.1 (1997). Cukup format tanggal menggunakanSimpleDateFormat
menggunakan pola format yang cocok dengan string input .Dalam kasus spesifik Anda "2 Januari 2010" sebagai string input:
MMMM
pola untuk itud
pola untuk itu.yyyy
pola untuk itu.Perhatikan pentingnya
Locale
argumen eksplisit . Jika Anda menghilangkannya, maka itu akan menggunakan lokal default yang belum tentu bahasa Inggris seperti yang digunakan dalam nama bulan dari string input. Jika lokal tidak cocok dengan string input, maka Anda akan bingungjava.text.ParseException
meskipun pola format tampak valid.Berikut adalah ekstrak relevansi dari javadoc , daftar semua pola format yang tersedia:
Perhatikan bahwa polanya peka huruf besar-kecil dan bahwa pola berbasis teks empat karakter atau lebih mewakili bentuk lengkap; jika tidak, formulir pendek atau disingkat digunakan jika tersedia. Jadi misal
MMMMM
atau lebih tidak perlu.Berikut adalah beberapa contoh
SimpleDateFormat
pola yang valid untuk mengurai string yang diberikan hingga saat ini:Sebuah catatan penting adalah bahwa
SimpleDateFormat
ini tidak thread aman. Dengan kata lain, Anda tidak boleh mendeklarasikan dan menetapkannya sebagai variabel statis atau instance dan kemudian menggunakannya kembali dari metode / utas berbeda. Anda harus selalu membuatnya baru dalam lingkup metode lokal.Pembaruan Java 8
Jika Anda menggunakan Java 8 atau yang lebih baru, gunakan
DateTimeFormatter
(juga di sini, klik tautan untuk melihat semua pemformat yang telah ditentukan dan pola format yang tersedia; tutorial tersedia di sini ). API baru ini terinspirasi oleh JodaTime .Catatan: jika pola format Anda mengandung bagian waktu juga, gunakan
LocalDateTime#parse(text, formatter)
sebagai gantiLocalDate#parse(text, formatter)
. Dan, jika pola format Anda juga mengandung zona waktu, maka gunakanlahZonedDateTime#parse(text, formatter)
.Berikut adalah ekstrak relevansi dari javadoc , daftar semua pola format yang tersedia:
Perhatikan bahwa ia memiliki beberapa formatters yang telah ditentukan sebelumnya untuk pola yang lebih populer. Jadi, alih-alih misalnya
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, Anda bisa menggunakanDateTimeFormatter.RFC_1123_DATE_TIME
. Ini dimungkinkan karena mereka, sebaliknyaSimpleDateFormat
, aman dari utas. Dengan demikian, Anda juga dapat mendefinisikan sendiri, jika perlu.Untuk format string input tertentu, Anda tidak perlu menggunakan eksplisit
DateTimeFormatter
: tanggal standar ISO 8601 , seperti 2016-09-26T17: 44: 57Z, dapat diuraikan secara langsungLocalDateTime#parse(text)
karena sudah menggunakanISO_LOCAL_DATE_TIME
formatter. Demikian pula,LocalDate#parse(text)
mem-parsing tanggal ISO tanpa komponen waktu (lihatISO_LOCAL_DATE
), danZonedDateTime#parse(text)
mem-parsing tanggal ISO dengan offset dan zona waktu ditambahkan (lihatISO_ZONED_DATE_TIME
).sumber
O
, bagaimana membiarkannya mencetakUTC+08:00
alih-alihGMT+08:00
. Saya tidak bisa mendapatkan contoh.20-JUN-16 12.00.00.000000000 AM
, butuh bantuan untuk mengonversi ini menjadi Date. Bantuan Anda sangat dihargai !!Ah ya diskusi Java Date, lagi. Untuk menangani manipulasi tanggal, kami menggunakan Date , Calendar , GregorianCalendar , dan SimpleDateFormat . Misalnya menggunakan tanggal Januari Anda sebagai masukan:
Kemudian Anda dapat memanipulasinya dengan sesuatu seperti:
sumber
sumber
Dengan Java 8 kami mendapatkan API Tanggal / Waktu baru ( JSR 310 ).
Cara berikut dapat digunakan untuk mengurai tanggal di Java 8 tanpa bergantung pada Joda-Time :
LocalDate adalah kelas Java 8 standar untuk mewakili tanggal (tanpa waktu). Jika Anda ingin mengurai nilai yang berisi informasi tanggal dan waktu, Anda harus menggunakan LocalDateTime . Untuk nilai dengan zona waktu, gunakan ZonedDateTime . Keduanya menyediakan
parse()
metode yang mirip denganLocalDate
:Daftar memformat karakter dari DateTimeFormatter Javadoc :
sumber
Meskipun beberapa jawaban secara teknis benar, mereka tidak disarankan.
Pustaka open-source open-source populer ini dapat digunakan di beberapa versi Java. Banyak contoh penggunaannya dapat ditemukan di StackOverflow. Membaca beberapa di antaranya akan membantu Anda mempercepat dengan cepat.
Kumpulan kelas baru ini diinspirasi oleh Joda-Time dan didefinisikan oleh JSR 310. Kelas-kelas ini dibangun ke dalam Java 8. Sebuah proyek sedang berlangsung untuk mendukung kelas-kelas ini ke Java 7, tetapi bahwa backporting tidak didukung oleh Peramal.
Date memiliki porsi tanggal dan waktu tertentu)
Awal hari tergantung pada zona waktu. Jika Anda gagal menentukan zona waktu, zona waktu default JVM diterapkan. Itu berarti perilaku kode Anda dapat berubah ketika dijalankan di komputer lain atau dengan pengaturan zona waktu yang dimodifikasi. Mungkin bukan yang Anda inginkan.
Bahasa Lokal menentukan bagaimana menafsirkan kata-kata (nama bulan dan hari) yang ditemukan selama parsing. ( Jawaban oleh BalusC menangani ini dengan benar.) Selain itu, Lokal mempengaruhi output beberapa formatters ketika menghasilkan representasi string dari tanggal-waktu Anda.
Joda-Time
Beberapa catatan tentang Joda-Time mengikuti.
Zona waktu
Dalam Joda-Time , objek DateTime benar-benar mengetahui zona waktu yang ditentukan. Ini kontras dengan kelas java.util.Date yang tampaknya memiliki zona waktu tetapi tidak.
Perhatikan dalam kode contoh di bawah ini bagaimana kita melewatkan objek zona waktu ke formatter yang mem-parsing string. Zona waktu itu digunakan untuk menafsirkan bahwa tanggal-waktu telah terjadi di zona waktu itu. Jadi, Anda perlu memikirkan dan menentukan zona waktu yang diwakili oleh input string itu.
Karena Anda tidak memiliki porsi waktu dalam string input Anda, Joda-Time menetapkan momen pertama hari dari zona waktu yang ditentukan sebagai waktu-hari. Biasanya ini berarti
00:00:00
tetapi tidak selalu, karena Daylight Saving Time (DST) atau anomali lainnya. Omong-omong, Anda dapat melakukan hal yang sama pada instance DateTime dengan meneleponwithTimeAtStartOfDay
.Pola Formatter
Karakter yang digunakan dalam pola formatter mirip dalam Joda-Time dengan yang ada di java.util.Date/Calendar tetapi tidak persis sama. Baca dengan cermat dok.
Kekekalan
Kami biasanya menggunakan kelas yang tidak dapat diubah di Joda-Time. Daripada memodifikasi objek Date-Time yang ada, kami memanggil metode yang membuat instance baru berdasarkan objek lain dengan sebagian besar aspek disalin kecuali di mana perubahan yang diinginkan. Contohnya adalah panggilan
withZone
masuk pada baris terakhir di bawah ini. Kekekalan membantu membuat Joda-Time sangat aman, dan juga bisa membuat beberapa pekerjaan lebih jelas.Konversi
Anda akan membutuhkan objek java.util.Date untuk digunakan dengan kelas / kerangka kerja lain yang tidak tahu tentang objek Joda-Time. Untungnya, sangat mudah untuk bergerak maju mundur.
Pergi dari objek java.util.Date (di sini bernama
date
) ke Joda-Time DateTime ...Pergi ke arah lain dari Joda-Time ke objek java.util.Date ...
Kode sampel
Saat dijalankan ...
sumber
Saat berurusan dengan kelas SimpleDateFormat, penting untuk diingat bahwa Date tidak aman untuk thread dan Anda tidak bisa berbagi objek Date tunggal dengan banyak utas.
Juga ada perbedaan besar antara "m" dan "M" di mana kasing kecil digunakan untuk menit dan kasing besar digunakan untuk bulan. Sama dengan "d" dan "D". Ini dapat menyebabkan bug halus yang sering terabaikan. Lihat Javadoc atau Panduan untuk Mengonversi String ke Tanggal di Java untuk detail lebih lanjut.
sumber
Ini bekerja dengan baik untuk saya.
sumber
Anda dapat menggunakan SimpleDateformat untuk mengubah string hingga saat ini
sumber
Selain itu, SimpleDateFormat tidak tersedia dengan beberapa teknologi sisi klien, seperti GWT .
Sebaiknya gunakan Calendar.getInstance (), dan persyaratan Anda adalah membandingkan dua tanggal; pergi untuk kencan lama.
sumber
Dua format sederhana yang telah kami gunakan:
Kami mem-parsing format tanggal hingga waktu penuh:
sumber
Program uji kerendahan hati saya. Saya menggunakannya untuk bermain-main dengan formatter dan mencari-cari tanggal panjang yang saya temukan di file log (tapi siapa yang meletakkannya di sana ...).
Program pengujian saya:
Hasil tes:
sumber
Tautan Sumber
Untuk Android
Calendar.getInstance (). GetTime () memberi
Menggunakan
sumber
Konversi string ke Tanggal:
sumber
Coba ini
sumber