Saya memiliki daftar dengan nilai panjang (misalnya: 1220227200, 1220832000, 1221436800 ...) yang saya unduh dari layanan web. Saya harus mengubahnya menjadi Tanggal. Sayangnya begini, misalnya:
Date d = new Date(1220227200);
mengembalikan 1 Jan 1970. Ada yang tahu cara lain untuk mengonversinya dengan benar?
java
date
long-integer
mmmiki
sumber
sumber
java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian.Jawaban:
The
Date
konstruktor (klik link!) Menerima saat itu sebagailong
di milidetik , tidak detik. Anda perlu mengalikannya dengan 1000 dan memastikan bahwa Anda memasukkannya sebagailong
.Ini terlihat di sini
sumber
Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));
untuk solusi yang lebih bersih dan tidak terlalu ajaib .tl; dr
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:
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.
Apakah kita berbicara tentang detik, milidetik , mikrodetik , atau nanodetik sejak zaman itu?
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:
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-bitint
.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.Untuk demonstrasi, sesuaikan kembali zona waktu.
Buang ke konsol. Perhatikan bagaimana tanggal di Montréal berbeda, karena hari baru telah dimulai di Eropa tetapi belum di Amerika.
Saat dijalankan.
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.Terapkan offset-from-UTC
ZoneOffset
untuk mendapatkan fileOffsetDateTime
.Lebih baik lagi, jika diketahui, terapkan zona waktu
ZoneId
untuk mendapatkan aZonedDateTime
.sumber
Sepertinya lama Anda adalah detik, dan bukan milidetik. Konstruktor tanggal membutuhkan waktu sebagai milis, jadi
sumber
Hanya mengatur waktu di pabrik pada objek Kalender
sumber
Itu mungkin stempel waktu dalam hitungan detik dan bukan dalam milidetik yang diperlukan untuk konstruktor Java new Date (long). Kalikan saja dengan 1000 dan Anda akan baik-baik saja.
sumber
Nilai panjang, kemungkinan besar, sesuai dengan stempel waktu Epoch , dan nilainya adalah:
1220227200 = Sen, 01 Sep 2008 00:00:00 GMT
1220832000 = Sen, 08 Sep 2008 00:00:00 GMT
1221436800 = Sen, 15 Sep 2008 00:00:00 GMT
Seseorang dapat mengonversi nilai panjang ini ke java.util.Date , dengan mempertimbangkan fakta java.util.Date menggunakan milidetik - seperti yang diisyaratkan sebelumnya, tetapi dengan beberapa kekurangan - seperti ini:
Sekarang, untuk menampilkan tanggal dengan benar, seseorang dapat menggunakan java.text.DateFormat seperti yang diilustrasikan selanjutnya:
Berikut hasil dari tampilan nilai long yang telah dikonversi menjadi java.util.Date tanpa menggunakan dan menggunakan DateFormat:
sumber
Coba ini:
sumber
1220227200 sesuai dengan 15 Jan 1980 (dan memang Tanggal baru (1220227200) .toString () mengembalikan "Kam 15 Jan 03:57:07 CET 1970"). Jika Anda meneruskan nilai panjang ke tanggal, yaitu sebelum 01/01/1970 itu sebenarnya akan mengembalikan tanggal 01/01/1970. Pastikan bahwa nilai Anda tidak dalam situasi ini (lebih rendah dari 82800000).
sumber
Coba ini dengan menyesuaikan format tanggal.
Catatan: Periksa siklus 24 jam atau 12 jam.
sumber
Tanggal Baru (angka) mengembalikan tanggal yang
number
milidetik setelah 1 Jan 1970. Kemungkinan format tanggal Anda tidak menunjukkan jam, menit, dan detik bagi Anda untuk melihat bahwa itu hanya sedikit setelah 1 Jan 1970.Anda perlu mengurai tanggal sesuai dengan perutean parsing yang benar. Saya tidak tahu apa itu 1220227200, tetapi jika itu beberapa detik setelah 1 JAN 1970, kalikan itu untuk menghasilkan milidetik. Jika tidak, maka konversikan dengan cara tertentu menjadi milidetik setelah tahun 1970 (jika Anda ingin terus menggunakan java.util.Date).
sumber
Bekerja untuk saya. Anda mungkin ingin mengalikannya dengan 1000, karena yang Anda dapatkan adalah detik dari tahun 1970 dan Anda harus melewati milidetik dari 1 Januari 1970
sumber