tl; dr
Instant.now() // Capture the current moment in UTC.
Hasilkan sebuah String untuk mewakili nilai itu:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Detail
Seperti yang dinyatakan oleh Jon Skeet , objek java.util.Date tidak memiliki zona waktu † . Tetapi toString
implementasinya menerapkan zona waktu default JVM ketika menghasilkan representasi String dari nilai tanggal-waktu itu. Yang membingungkan bagi programmer naif, Date tampaknya memiliki zona waktu tetapi tidak.
Kelas java.util.Date
,, j.u.Calendar
dan yang java.text.SimpleDateFormat
dibundel dengan Java terkenal merepotkan. Hindari mereka. Alih-alih, gunakan salah satu dari perpustakaan waktu-waktu yang kompeten ini:
java.time (Java 8)
Java 8 menghadirkan paket java.time baru . * Untuk menggantikan kelas java.util.Date/Calendar yang lama.
Mendapatkan waktu saat ini dalam UTC / GMT adalah satu garis sederhana ...
Instant instant = Instant.now();
Bahwa Instant
kelas adalah blok bangunan dasar dalam java.time, mewakili sejenak di timeline di UTC dengan resolusi nanodetik .
Di Java 8, momen saat ini ditangkap hanya dengan resolusi hingga milidetik. Java 9 membawa implementasi segar dari Clock
menangkap momen saat ini dalam hingga kemampuan nanodetik penuh kelas ini, tergantung pada kemampuan jam komputer host Anda hardware.
Hal ini toString
metode menghasilkan representasi String dari nilainya menggunakan satu tertentu format ISO 8601 . Format itu menghasilkan nol, tiga, enam atau sembilan digit digit ( milidetik , mikrodetik , atau nanodetik ) seperlunya untuk merepresentasikan fraksi detik.
Jika Anda ingin pemformatan yang lebih fleksibel, atau fitur tambahan lainnya, maka terapkan offset-from-UTC dari nol, untuk UTC itu sendiri ( ZoneOffset.UTC
konstan ) untuk mendapatkan a OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Dump untuk menghibur ...
System.out.println( "now.toString(): " + now );
Saat dijalankan ...
now.toString(): 2014-01-21T23:42:03.522Z
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
.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
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 .
Joda-Time
UPDATE: Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Dengan menggunakan pustaka bebas-sumber terbuka sumber terbuka Joda-Time pihak ke-3, Anda bisa mendapatkan tanggal-waktu saat ini hanya dalam satu baris kode.
Joda-Time menginspirasi kelas java.time. * Baru di Java 8, tetapi memiliki arsitektur yang berbeda. Anda dapat menggunakan Joda-Time di versi Java yang lebih lama. Joda-Time terus bekerja di Jawa 8 dan terus dipelihara secara aktif (per 2014). Namun, tim Joda-Time tidak menyarankan migrasi ke java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Kode contoh yang lebih rinci (Joda-Time 2.3) ...
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Dump untuk menghibur ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Saat dijalankan ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Untuk lebih banyak contoh kode melakukan pekerjaan zona waktu, lihat jawaban saya untuk pertanyaan serupa.
Zona waktu
Saya sarankan Anda selalu menentukan zona waktu daripada bergantung secara implisit pada zona waktu default JVM saat ini (yang dapat berubah setiap saat!). Ketergantungan seperti itu tampaknya menjadi penyebab umum kebingungan dan bug dalam pekerjaan berkencan.
Saat menelepon now()
lewat zona waktu yang diinginkan / diharapkan untuk ditugaskan. Gunakan DateTimeZone
kelas.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Kelas itu memiliki konstanta untuk zona waktu UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Jika Anda benar-benar ingin menggunakan zona waktu default JVM saat ini, buat panggilan eksplisit sehingga kode Anda bisa didokumentasikan sendiri.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Baca tentang format ISO 8601 . Baik java.time dan Joda-Time menggunakan format masuk akal standar itu sebagai default untuk parsing dan menghasilkan string.
† Sebenarnya, java.util.Date memang memiliki zona waktu, terkubur dalam-dalam di bawah lapisan kode sumber. Untuk tujuan paling praktis, zona waktu itu diabaikan. Jadi, sebagai singkatan, kita katakan java.util.Date tidak memiliki zona waktu. Lebih jauh, zona waktu yang terkubur itu bukan zona yang digunakan oleh toString
metode Date ; metode itu menggunakan zona waktu default JVM saat ini. Semua alasan untuk menghindari kelas yang membingungkan ini dan tetap dengan Joda-Time dan java.time.