Java: unix zaman damgasından tarih


237

Bir unix zaman damgasını bir tarih nesnesine dönüştürmek gerekiyor.
Bunu denedim:

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

Zaman damgası değeri: 1280512800

Tarih "2010/07/30 - 22:30:00" olmalıdır (PHP ile aldığım gibi) ama bunun yerine alıyorum Thu Jan 15 23:11:56 IRST 1970.

Nasıl yapılmalı?


3
Java 8 veya daha
yenisini kullanıyorsanız

1
FYI, java.time sınıflarının yerini alan eski tarih-saat gibi zahmetli sınıflar java.util.Dateartık miras . Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


429

İçin 12805128001000 ile çarpın, java beri milisaniye bekliyor:

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

Zaten milisaniye varsa, o zaman sadece new java.util.Date((long)timeStamp);

Gönderen belgeler :

Bir Date nesnesi tahsis eder ve bunu, "çağ" olarak bilinen standart taban süreden, yani 1 Ocak 1970, 00:00:00 GMT'den bu yana belirtilen milisaniye sayısını temsil edecek şekilde başlatır.


41
Oyuncular (long)çok önemlidir: onsuz tamsayı taşar.
mneri

2
@TomasK java.util.Date, sınıfın tam adıdır. sınıfınıza paketi aktarmanız şartıyla Datemuhtemelen aynı şeydirjava.util .
Pablo Santa Cruz

5
Uzun kullanım süresi gerekli değildir. time = new java.util.Date (timeStamp * 1000L) de işe yarıyor (1000L uzun olduğu için zaman damgası çarpımdan çok önce yayınlanacak)
Tony BenBrahim

2
Şahsen yapardım:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral

3
FYI, java.time sınıflarının yerini alan eski tarih-saat gibi zahmetli sınıflar java.util.Dateartık miras . Oracle'ın Öğreticisine bakın .
Basil Bourque

60

java.time

Java 8 , tarih ve saatlerle çalışmak için yeni bir API tanıttı: java.time paketi .

Java.time ile, 1970, 1970-01-01T00: 00Z'de 1970'in ilk anının dönem referansından bu yana tam saniye sayınızı ayrıştırabilirsiniz. Sonuç bir Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Java.timejava.util.Date için henüz güncellenmemiş eski kodlarla birlikte çalışmak için bir şeye ihtiyacınız varsa dönüştürün. Eski sınıflara eklenen yeni dönüşüm yöntemlerini çağırın.

Date date = Date.from( instant );

3
Bu Yanıt teknik olarak doğru olsa da, java.time sınıflarının, sorunlu eski tarih-saat sınıflarını tamamladığını unutmayın java.util.Date. Eski sınıflar miras ve kaçınılmalıdır. Gerçekten miras ve java.time sınıflarına / sınıflarından dönüştürebilirsiniz, ancak mümkün olduğunda java.time'a bağlı kalmak en iyisidir.
Basil Bourque


27

Takvim yeni bir yol gibi görünüyor:

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

Son satır sadece nasıl kullanılacağına bir örnektir, bu da örneğin "14.06.2012" yazdıracaktır.

Zaman Damgasını kaydetmek için System.currentTimeMillis () yöntemini kullandıysanız, "* 1000" bölümüne ihtiyacınız yoktur.

Bir dizede zaman damgası varsa, önce uzun olarak ayrıştırmanız gerekir: Long.parseLong (timestamp).

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


8
Uyarı: Eğer timestampbir tamsayı ise (long)önce onu atamanız gerekir , aksi takdirde yanlış tarihlerle sonuçlanırsınız. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija

Bağlantıyı düzelttim.
Ricbit

Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

26

tl; Dr.

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

Java 8 ve sonraki sürümlerinde oluşturulan yeni java.time çerçevesi Joda-Time'ın halefidir.

Bu yeni sınıflar , çağdan tam saniyenin bir sayısını dönüştürmek için kullanışlı bir fabrika yöntemini içerir . InstantUTC'deki zaman çizelgesinde nanosaniye çözünürlüğe kadar bir an alırsınız .

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

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

Bu kodun IdeOne.com'da canlı yayınlandığını görün .

Java'da hem modern hem de eski tarih-saat türleri tablosu

Asia/Kabul veya Asia/Tehran zaman dilimleri?

Burada görülen saat 18:00 yerine saat 22:30 değerini aldınız. PHP yardımcı programı dolaylı olarak UTC ayarlamak için varsayılan bir saat dilimi uyguluyor şüpheli. Buradaki değerim, Z(kısa Zulu, UTC anlamına gelir) ile belirtilen UTC'dir. Makineniz OS veya PHP ayarlandığında herhangi bir şans Asia/Kabulya da Asia/Tehranzaman dilimleri? Sanırım IRSTçıktılarınızda rapor ettiğiniz gibi , bu İran zamanı anlamına geliyor. Şu anda 2017'de UTC'den dört buçuk saat önce yaz saati ile çalışan tek bölgeler bunlar .

Bir belirtme uygun bir zaman dilimi adı biçiminde continent/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland. 3-4 harfli bir kısaltma kullanmayın gibi ESTya ISTya IRSToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).

Eğer varsa istediğiniz belirli bir bölgenin zaman dilimine lensleri vasıtasıyla an görmek, bir geçerli ZoneIdbir olsun ZonedDateTime. Hala aynı anda, ama farklı bir duvar saati zamanı olarak görülüyor .

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 [Asya / Tahran]

Java.time'dan eski sınıflara dönüştürme

Yeni java.time sınıflarına sadık kalmalısınız. Ancak gerekirse eski haline dönüştürebilirsiniz.

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

Joda-Time

GÜNCELLEME: Joda-Time projesi şu anda bakım modunda ve ekip java.time'a geçişi tavsiye ediyor sınıflarına .

Joda-Time DateTime yapıcısı FYI benzer: Bir long(değil int!) Üretmek için bin ile çarpın .

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

Kötü niyetli java.util.Date ve .Calendar sınıflarından kaçınmak en iyisidir. Ancak bir Tarih kullanmanız gerekiyorsa, Joda-Time'dan dönüştürebilirsiniz.

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

Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya üzeri ile uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirsiniz?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


11

Date'in yapıcısı, timeStamp değerinin milisaniye cinsinden olmasını bekler. Zaman damganızın değerini 1000 ile çarpın, sonra pass yapıcıya geçer.


7

Farklı bir makinede zaman damgası değerini dönüştürüyorsanız, o makinenin saat dilimini de kontrol etmelisiniz. Örneğin;

EST veya UTC saat dilimleri ile çalıştırırsanız yukarıdaki açıklamalarda farklı Tarih değerleri elde edilir.

Saat dilimini ayarlamak için; UTC'ye göre, sadece yeniden yazabilirsiniz;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

6
Bunu tavsiye etmem, çünkü bu sadece ayrıştırma süreci için değil, tüm jvm için saat dilimini ayarlar!

1

Kotlin için

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

}

0

Bazen ayarlarla çalışmanız gerekir.

Uzun süre döküm kullanmayın! Nano ayar kullanın.

Örneğin, ticaret için Oanda Java API'sini kullanarak tarih saatini UNIX biçimi olarak alabilirsiniz.

Örneğin: 1592523410.590566943

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

olsun:

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

Ayrıca kullan:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
Daha fazla metin olmadan, bu cevabın bu sorudaki diğer pek çok kişiye niçin tercih edileceği açık değildir. Lütfen açıklar mısın?
Duncan Jones

Bu, tarihi dönüştürmek yerine değiştirir!
backslashN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.