tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Ketahui Data Anda
Orang menggunakan berbagai presisi dalam melacak waktu sebagai angka sejak zaman . Jadi, ketika Anda memperoleh beberapa angka untuk ditafsirkan sebagai hitungan sejak zaman, Anda harus menentukan:
- Zaman apa?
Banyak tanggal zaman telah digunakan dalam berbagai sistem. Yang umum digunakan adalah waktu POSIX / Unix , dimana epoch adalah momen pertama tahun 1970 di UTC. Tetapi Anda tidak harus menganggap zaman ini.
- Presisi apa?
Apakah kita berbicara tentang detik, milidetik , mikrodetik , atau nanodetik sejak zaman itu?
- Zona waktu apa?
Biasanya penghitungan karena waktu berada dalam zona waktu UTC / GMT, artinya, tidak ada pengimbangan zona waktu sama sekali. Tapi terkadang, ketika melibatkan programmer yang tidak berpengalaman atau tidak tahu waktu, mungkin ada zona waktu yang tersirat.
Dalam kasus Anda, seperti yang dicatat orang lain, Anda tampaknya telah diberikan detik sejak zaman Unix. Tetapi Anda meneruskan detik-detik itu ke konstruktor yang mengharapkan milidetik. Jadi solusinya adalah dengan mengalikan 1.000.
Pelajaran yang dipelajari:
- Tentukan, jangan berasumsi, arti dari data yang diterima.
- Baca dok .
Data Anda
Data Anda sepertinya dalam hitungan detik. Jika kita mengasumsikan periode awal tahun 1970, dan jika kita mengasumsikan zona waktu UTC, maka itu 1,220,227,200
adalah momen pertama pada hari pertama September 2008.
Waktu Joda
Kelas java.util.Date dan .Calendar yang digabungkan dengan Java sangat merepotkan. Hindari mereka. Gunakan library Joda-Time atau paket java.time baru yang dibundel di Java 8 (dan terinspirasi oleh Joda-Time).
Perhatikan bahwa tidak seperti juDate, a DateTime
di Joda-Time benar-benar mengetahui zona waktu yang telah ditetapkan . Jadi dalam contoh kode Joda-Time 2.4 yang terlihat di bawah ini, perhatikan bahwa pertama-tama kita mengurai milidetik menggunakan asumsi default UTC. Kemudian, kedua, kami menetapkan zona waktu Paris untuk disesuaikan. Momen yang sama di garis waktu Semesta, tetapi waktu jam dinding yang berbeda . Untuk demonstrasi, kita sesuaikan lagi, ke UTC. Hampir selalu lebih baik untuk secara eksplisit menentukan zona waktu yang Anda inginkan / diharapkan daripada mengandalkan default implisit (sering kali menjadi penyebab masalah dalam pekerjaan tanggal-waktu).
Kita membutuhkan milidetik untuk membuat DateTime. Jadi ambillah masukan Anda dalam hitungan detik, dan kalikan dengan seribu. Perhatikan bahwa hasilnya harus 64-bit long
karena kita akan melimpah 32-bit int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Masukkan hitungan milidetik itu ke konstruktor. Konstruktor tertentu mengasumsikan hitungannya dari zaman Unix tahun 1970. Jadi sesuaikan zona waktu yang diinginkan, setelah konstruksi.
Gunakan nama zona waktu yang tepat , kombinasi benua dan kota / kawasan. Jangan pernah menggunakan kode 3 atau 4 huruf EST
karena keduanya tidak terstandardisasi, tidak unik.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Untuk demonstrasi, sesuaikan kembali zona waktu.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Buang ke konsol. Perhatikan bagaimana tanggal di Montréal berbeda, karena hari baru telah dimulai di Eropa tetapi belum di Amerika.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Saat dijalankan.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Pembuat Joda-Time telah meminta kami untuk bermigrasi ke kerangka penggantinya, java.time sesegera mungkin. Sementara Joda-Time terus didukung secara aktif, semua pengembangan di masa depan akan dilakukan pada kelas java.time dan ekstensinya dalam proyek ThreeTen-Extra.
Framework java-time ditentukan oleh JSR 310 dan dibangun ke dalam Java 8 dan yang lebih baru. Kelas java.time telah di-back-port ke Java 6 & 7 pada proyek ThreeTen-Backport dan ke Android dalam proyek ThreeTenABP .
Sebuah Instant
momen di timeline dalam UTC dengan resolusi nanodetik. Zamannya adalah momen pertama tahun 1970 di UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Terapkan offset-from-UTC ZoneOffset
untuk mendapatkan file OffsetDateTime
.
Lebih baik lagi, jika diketahui, terapkan zona waktu ZoneId
untuk mendapatkan a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );