Java: Tanggal dari cap waktu unix

237

Saya perlu mengubah cap waktu unix menjadi objek tanggal.
Saya mencoba ini:

java.util.Date time = new java.util.Date(timeStamp);

Nilai cap waktu adalah: 1280512800

Tanggal harus "2010/07/30 - 22:30:00" (seperti yang saya dapatkan dari PHP) tetapi saya mendapatkannya Thu Jan 15 23:11:56 IRST 1970.

Bagaimana seharusnya itu dilakukan?

RYN
sumber
3
Jika Anda menggunakan Java 8 atau yang lebih baru: Lihat jawaban ini: stackoverflow.com/a/24703644/1115554
micha
1
FYI, kelas tanggal-waktu lama yang menyusahkan seperti java.util.Datesekarang adalah warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

429

Untuk 1280512800, kalikan dengan 1000, karena java mengharapkan milidetik:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Jika Anda sudah memiliki milidetik, maka cukup new java.util.Date((long)timeStamp);

Dari dokumentasi :

Mengalokasikan objek Tanggal dan menginisialisasi untuk mewakili jumlah milidetik yang ditentukan sejak waktu basis standar yang dikenal sebagai "zaman", yaitu 1 Januari 1970, 00:00:00 GMT.

Pablo Santa Cruz
sumber
41
Para pemain (long)sangat penting: tanpa itu bilangan bulat meluap.
mneri
2
@TomasK java.util.Dateadalah nama kelas yang sepenuhnya memenuhi syarat. Datemungkin hal yang sama persis asalkan Anda mengimpor java.utilpaket di kelas Anda.
Pablo Santa Cruz
5
Gips terlalu lama tidak diperlukan. time = new java.util.Date (timeStamp * 1000L) bekerja dengan baik (karena 1000L panjang, timestamp akan di-upcast jauh sebelum multiplikasi)
Tony BenBrahim
2
Saya pribadi akan melakukan:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral
3
FYI, kelas tanggal-waktu lama yang menyusahkan seperti java.util.Datesekarang adalah warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
60

waktu java

Java 8 memperkenalkan API baru untuk bekerja dengan tanggal dan waktu: paket java.time .

Dengan java.time Anda dapat menguraikan hitungan detik penuh Anda sejak referensi zaman pertama 1970 di UTC, 1970-01-01T00: 00Z. Hasilnya adalah Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Jika Anda memerlukan java.util.Dateuntuk beroperasi dengan kode lama yang belum diperbarui untuk java.time , konversi. Panggil metode konversi baru yang ditambahkan ke kelas lama.

Date date = Date.from( instant );
micha
sumber
3
Meskipun Jawaban ini benar secara teknis, perhatikan bahwa kelas java.time menggantikan kelas tanggal-waktu lama yang menyusahkan seperti java.util.Date. Kelas-kelas lama adalah warisan dan harus dihindari. Meskipun Anda memang dapat mengonversi ke / dari kelas legacy dan java.time, yang terbaik adalah tetap menggunakan java.time kapan pun memungkinkan.
Basil Bourque
44

Ini cara yang benar:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Marco Fantasia
sumber
27

Sepertinya Kalender adalah cara baru untuk pergi:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

Baris terakhir hanyalah contoh bagaimana menggunakannya, yang ini akan mencetak misalnya "14.06.2012".

Jika Anda telah menggunakan System.currentTimeMillis () untuk menyimpan Timestamp, Anda tidak memerlukan bagian "* 1000".

Jika Anda memiliki stempel waktu dalam string, Anda harus menguraikannya terlebih dahulu sebagai panjang: Long.parseLong (timestamp).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

Stefan
sumber
8
Peringatan: jika timestampbilangan bulat, Anda harus mengubahnya (long)terlebih dahulu, jika tidak, Anda akan berakhir dengan tanggal yang salah. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija
Saya telah memperbaiki tautannya.
Ricbit
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque
26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

waktu java

Kerangka java.time baru dibangun ke dalam Java 8 dan kemudian adalah penerus Joda-Time.

Kelas-kelas baru ini termasuk metode pabrik yang berguna untuk mengkonversi hitungan seluruh detik dari zaman. Anda mendapatkan Instant, sesaat di timeline dalam UTC dengan resolusi hingga nanodetik.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Lihat kode dijalankan langsung di IdeOne.com .

Tabel tipe waktu-tanggal di Jawa, baik yang modern maupun yang lama

Asia/Kabulatau Asia/Tehranzona waktu?

Anda melaporkan mendapatkan nilai waktu hari 22:30 bukannya 18:00 yang terlihat di sini. Saya menduga utilitas PHP Anda secara implisit menerapkan zona waktu default untuk menyesuaikan dari UTC. Nilai saya di sini adalah UTC, ditandai dengan Z(kependekan dari Zulu, berarti UTC). Setiap kesempatan OS komputer Anda atau PHP diatur ke Asia/Kabulatau Asia/Tehranzona waktu? Saya kira begitu ketika Anda melaporkan IRSTdalam output Anda yang tampaknya berarti waktu Iran. Saat ini di 2017 mereka adalah satu-satunya zona yang beroperasi dengan waktu musim panas yaitu empat setengah jam lebih awal dari UTC.

Tentukan nama zona waktu yang tepat dalam format continent/region, seperti America/Montreal, Africa/Casablanca, atau Pacific/Auckland. Jangan menggunakan singkatan 3-4 huruf seperti ESTatau ISTatau IRSTkarena mereka tidak zona benar waktu, tidak standar, dan bahkan tidak unik (!).

Jika Anda ingin melihat momen Anda melalui lensa zona waktu wilayah tertentu, terapkan a ZoneIduntuk mendapatkan ZonedDateTime. Masih momen simultan yang sama, tetapi dilihat sebagai waktu jam dinding yang berbeda .

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22: 30 + 04: 30 [Asia / Teheran]

Mengonversi dari java.time ke kelas lawas

Anda harus tetap menggunakan kelas java.time baru. Tetapi Anda dapat mengonversi ke yang lama jika diperlukan.

java.util.Date date = java.util.Date.from( instant );

Joda-Time

UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time .

FYI, konstruktor untuk DateTime Joda-Time serupa: Kalikan dengan seribu untuk menghasilkan (bukan !).longint

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

Terbaik untuk menghindari kelas java.util.Date dan .Calendar yang terkenal bermasalah. Tetapi jika Anda harus menggunakan Tanggal, Anda dapat mengonversi dari Joda-Time.

java.util.Date date = dateTime.toDate();

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 .

Basil Bourque
sumber
11

Konstruktor Date mengharapkan nilai timeStamp dalam milidetik. Lipat gandakan nilai stempel waktu Anda dengan 1000, lalu berikan kepada konstruktor.

f1sh
sumber
7

Jika Anda mengonversi nilai cap waktu pada mesin yang berbeda, Anda juga harus memeriksa zona waktu mesin tersebut. Sebagai contoh;

Dekripsi di atas akan menghasilkan nilai Tanggal yang berbeda, jika Anda menjalankan dengan zona waktu EST atau UTC.

Untuk mengatur zona waktu; alias ke UTC, Anda cukup menulis ulang;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
tmr
sumber
6
Saya tidak akan merekomendasikan ini karena ini menetapkan zona waktu untuk seluruh jvm dan bukan hanya proses parsing!
1

Untuk kotlin

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}
Arda Kazancı
sumber
0

Terkadang Anda perlu bekerja dengan penyesuaian.

Jangan gunakan gips terlalu lama! Gunakan nanoadjustment.

Misalnya, menggunakan Oanda Java API untuk perdagangan Anda bisa mendapatkan datetime sebagai format UNIX.

Misalnya: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

Anda mendapatkan:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

Juga, gunakan:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );
Damir Isanbirdin
sumber
-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Masatsugu Hosoi
sumber
3
Tanpa teks lagi, tidak jelas mengapa jawaban ini lebih disukai daripada banyak orang lain dalam pertanyaan ini. Bisakah Anda mengklarifikasi?
Duncan Jones
Ini akan mengubah tanggal daripada mengubahnya!
backslashN