Saya memiliki tanggal sebagai berikut: 2011-08-12T20:17:46.384Z
. Format apa ini? Saya mencoba untuk menguraikannya dengan Java 1.4 via DateFormat.getDateInstance().parse(dateStr)
dan saya mengerti
java.text.ParseException: Tanggal tidak dapat diparsing: "2011-08-12T20: 17: 46.384Z"
Saya pikir saya harus menggunakan SimpleDateFormat untuk parsing, tetapi saya harus tahu format string terlebih dahulu. Yang saya miliki sejauh ini adalah yyyy-MM-dd
, karena saya tidak tahu apa T
arti dari string ini - sesuatu yang berhubungan dengan zona waktu? String tanggal ini berasal dari lcmis:downloadedOn
tag yang ditampilkan pada jenis media riwayat unduhan File CMIS .
Z
pada akhirnya adalah kependekan dariZulu
dan artinya UTC . Format ini tentunya merupakan bagian dari koleksi format teks waktu-standar ISO 8601 . Omong-omong, format standar ini digunakan secara default di kelas java.time .java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .Jawaban:
T hanyalah literal untuk memisahkan tanggal dari waktu, dan Z berarti "offset nol jam" yang juga dikenal sebagai "waktu Zulu" (UTC). Jika string Anda selalu memiliki "Z", Anda dapat menggunakan:
Atau menggunakan Joda Time , Anda bisa menggunakan
ISODateTimeFormat.dateTime()
.sumber
T
danZ
?T
(saya tidak ingat bagaimana SimpleDateFormat menangani specifier yang tidak diketahui) tetapi karenaZ
kami ingin itu menjadi karakter 'Z' daripada "nilai offset UTC" (misalnya "00").tl; dr
Format standar ISO 8601 digunakan oleh string input Anda.
ISO 8601
Format ini ditentukan oleh standar praktis yang masuk akal, ISO 8601 .
The
T
memisahkan bagian tanggal dari porsi waktu-of-hari. PadaZ
akhirnya berarti UTC (yaitu, offset-dari-UTC nol jam-menit-detik). TheZ
adalah diucapkan “Zulu” .waktu java
Kelas tanggal-waktu lama yang dibundel dengan versi Jawa yang paling awal telah terbukti dirancang dengan buruk, membingungkan, dan menyusahkan. Hindari mereka.
Sebagai gantinya, gunakan kerangka kerja java.time yang ada di dalam Java 8 dan yang lebih baru. Kelas java.time menggantikan kedua kelas tanggal-waktu lama dan perpustakaan Joda-Time yang sangat sukses.
Kelas java.time menggunakan ISO 8601 secara default ketika parsing / menghasilkan representasi tekstual dari nilai-nilai tanggal-waktu.
The
Instant
kelas merupakan saat di timeline di UTC dengan resolusi nanodetik . Kelas itu dapat secara langsung mem-parsing string input Anda tanpa perlu repot menentukan pola pemformatan.Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti
Interval
,YearWeek
,YearQuarter
, dan lebih .sumber
Tidak yakin tentang Java parsing, tapi itu ISO8601: http://en.wikipedia.org/wiki/ISO_8601
sumber
Ada cara lain untuk menguraikannya daripada jawaban pertama. Untuk menguraikannya:
(1) Jika Anda ingin mengambil informasi tentang tanggal dan waktu, Anda dapat menguraikannya ke objek
ZonedDatetime
(karena Java 8 ) atauDate
(lama):atau
(2) Jika Anda tidak peduli tanggal dan waktu dan hanya ingin memperlakukan informasi sebagai momen dalam nanodetik, maka Anda dapat menggunakan
Instant
:sumber
Jika Anda mencari solusi untuk Android, Anda dapat menggunakan kode berikut untuk mendapatkan detik dari jaman timestamp.
Input sampel: 2019-10-15T05: 51: 31.537979Z
Contoh output: 1571128673
sumber
Anda dapat menggunakan contoh berikut ini.
sumber
Z
. Itu berarti mengharapkan tetapi mengabaikan surat itu. Tapi surat itu jangan diabaikan. Surat itu memberikan informasi berharga, fakta bahwa string itu ditujukan untuk UTC, offset dari nol. Format Anda membuang fakta penting ini. Lebih jauh lagi, tidak perlu repot mendefinisikan pola format ini. Formatter untuk pola ini sudah terpasang.Teknik ini menerjemahkan java.util.Date ke format UTC (atau yang lain) dan kembali lagi.
Tentukan kelas seperti ini:
}
Kemudian gunakan seperti ini:
atau
Anda juga dapat menentukan format tanggal lainnya jika diperlukan (bukan hanya UTC)
sumber
java.util.Date
dan proyek Joda-Time digantikan tahun yang lalu oleh kelas java.time modern yang didefinisikan dalam JSR 310. Saran di sini sudah lama usang.@ John-Skeet memberi saya petunjuk untuk memperbaiki masalah saya sendiri tentang ini. Sebagai programmer yang lebih muda, masalah kecil ini mudah untuk dilewatkan dan sulit didiagnosis. Jadi saya membagikannya dengan harapan ini akan membantu seseorang.
Masalah saya adalah bahwa saya ingin mengurai string berikut yang berisi cap waktu dari JSON yang tidak saya pengaruhi dan memasukkannya ke dalam variabel yang lebih berguna. Tapi saya terus mendapatkan kesalahan.
Jadi diberi yang berikut (perhatikan parameter string di dalam ofPattern ();
Kesalahan:
Masalah? Z di akhir Pola harus dibungkus 'Z' seperti 'T'. Ubah
"yyyyMMdd'T'HHmmss.SSSZ"
ke"yyyyMMdd'T'HHmmss.SSS'Z'"
dan berfungsi.Menghapus Z dari pola semuanya juga menyebabkan kesalahan.
Terus terang, saya berharap kelas Java mengantisipasi ini.
sumber
T
literal dan perlu dikutip,Z
merupakan offset (nol) dan perlu diurai seperti itu, atau Anda akan mendapatkan hasil yang salah. Saya tidak tahu apa maksud Anda bahwa hal itu belum diantisipasi, saya percaya hal itu telah terjadi.Z
. Anda membuang informasi berharga. Memproses nilai tanggal-waktu sambil mengabaikan zona waktu atau mengimbangi-dari-UTC sama seperti memproses sejumlah uang sambil mengabaikan mata uang!T
hanya memisahkan bagian tanggal dari porsi waktu-of-hari, dan menambahkan tidak ada artinya. DiZ
sisi lain pasti menambah makna.