Saya memiliki string tanggal dan saya ingin menguraikannya ke tanggal normal menggunakan java Date API, berikut ini adalah kode saya:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Namun saya mendapat pengecualian: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Jadi saya ingin tahu apakah saya harus memisahkan string dan menguraikannya secara manual?
BTW, saya telah mencoba menambahkan karakter kutipan tunggal di kedua sisi T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Itu juga tidak bekerja.
java
date
simpledateformat
iso8601
hguser
sumber
sumber
T
singkatan waktu dan merupakan bagian dari ISO8601 standar untuk waktu tanggal internasional format.T
dalam tanda kutip tunggal bekerja untuk saya (setidaknya dalam hal menyelesaikan kesalahan parse).Jawaban:
Pembaruan untuk Java 8 dan lebih tinggi
Anda sekarang dapat dengan mudah melakukan
Instant.parse("2015-04-28T14:23:38.521Z")
dan mendapatkan hal yang benar sekarang, terutama karena Anda harus menggunakanInstant
alih-alih rusakjava.util.Date
dengan versi terbaru dari Java.Anda harus menggunakan,
DateTimeFormatter
bukanSimpleDateFormatter
juga.Jawaban asli:
Ini bekerja dengan input dengan trailing
Z
seperti yang ditunjukkan:Q2597083.java
Menghasilkan output berikut:
sumber
tl; dr
Gunakan
java.time.Instant
kelas untuk mem-parsing teks dalam format standar ISO 8601, mewakili momen dalam UTC.ISO 8601
Format itu ditentukan oleh standar ISO 8601 untuk format string tanggal-waktu.
Kedua:
... gunakan format ISO 8601 secara default untuk parsing dan menghasilkan string.
Anda umumnya harus menghindari menggunakan kelas java.util.Date /.Calendar & java.text.SimpleDateFormat yang lama karena mereka terkenal merepotkan, membingungkan, dan cacat. Jika diperlukan untuk beroperasi, Anda dapat mengonversi ke sana kemari.
waktu java
Dibangun ke dalam Java 8 dan yang lebih baru adalah kerangka java.time baru . Terinspirasi oleh Joda-Time , didefinisikan oleh JSR 310 , dan diperpanjang oleh proyek ThreeTen-Extra .
Konversikan ke kelas lama.
Zona waktu
Jika perlu, Anda dapat menetapkan zona waktu.
Mengubah.
Joda-Time
UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan. Tim menyarankan migrasi ke kelas java.time .
Berikut adalah beberapa contoh kode dalam Joda-Time 2.8.
Konversi ke kelas lama. Perhatikan bahwa zona waktu yang ditetapkan hilang dalam konversi, karena juDate tidak dapat ditetapkan zona waktu.
Zona waktu
Jika perlu, Anda dapat menetapkan zona waktu.
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 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk
java.sql.*
kelas.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
Ada dua jawaban di atas yang up-to-sekarang dan keduanya panjang (dan tl; dr terlalu pendek IMHO), jadi saya menulis ringkasan dari pengalaman saya mulai menggunakan perpustakaan java.time baru (berlaku sebagaimana tercantum dalam jawaban lain untuk versi Java 8+). ISO 8601 menetapkan cara standar untuk menulis tanggal:
YYYY-MM-DD
jadi format waktu-tanggal hanya seperti di bawah ini (bisa 0, 3, 6 atau 9 digit selama milidetik) dan tidak perlu memformat string:Saya tidak membutuhkannya, tetapi karena mendapatkan tahun adalah dalam kode dari pertanyaan, maka:
lebih sulit, tidak dapat dilakukan
Instant
secara langsung, dapat dilakukan melaluiCalendar
cara pertanyaan. Dapatkan nilai integer tahun ini di Jawa dan Konversi java. waktu untuk Kalender tetapi IMHO karena formatnya diperbaiki substring lebih mudah digunakan:sumber