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.
Verilerinizi Tanıyın
İnsanlar, bir çağdan beri bir sayı olarak izleme süresinde çeşitli hassasiyetler kullanırlar . Bu nedenle, bir dönemden beri sayım olarak yorumlanacak bazı sayılar elde ettiğinizde, şunları belirlemelisiniz:
- Hangi dönem? Çeşitli sistemlerde
birçok çağ tarihi kullanılmıştır. Yaygın olarak kullanılan POSIX / Unix zamanıdır , burada dönem UTC'de 1970'in ilk anıdır. Ama bu dönemi üstlenmemelisiniz .
- Ne hassasiyeti? Çağdan beri
saniyeler, milisaniyeler , mikrosaniyeler veya nanosaniyelerden mi bahsediyoruz ?
- Hangi saat dilimi? Zaman dilimi UTC / GMT saat diliminde
olduğu için genellikle bir sayım , yani saat dilimi farkı yoktur. Ancak bazen deneyimsiz veya tarih-zaman bilgisine sahip olmayan programcılar söz konusu olduğunda, zımni bir saat dilimi olabilir.
Sizin durumunuzda, diğerlerinin de belirttiği gibi, Unix döneminden bu yana size saniyeler verildi. Ancak bu saniyeleri milisaniyeler bekleyen bir kurucuya geçiriyorsunuz. Yani çözüm 1000 ile çarpmaktır.
Dersler öğrenildi:
- Alınan verilerin anlamını belirleyin, varsaymayın.
- Dokümanı okuyun .
Verileriniz
Verileriniz saniyeler içinde görünüyor. 1970'in başlangıcını varsayarsak ve UTC zaman dilimini varsayarsak, o zaman 1,220,227,200
Eylül 2008'in ilk gününün ilk anıdır.
Joda-Time
Java ile birlikte verilen java.util.Date ve .Calendar sınıfları, herkesin bildiği gibi zahmetlidir. Onlardan kaçının. Bunun yerine Joda-Time kitaplığını veya Java 8'de paketlenen (ve Joda-Time'dan esinlenen) yeni java.time paketini kullanın .
JuDate'ten farklı olarak, DateTime
Joda-Time'da a'nın kendi atanmış zaman dilimini gerçekten bildiğini unutmayın . Bu nedenle, aşağıda görülen örnek Joda-Time 2.4 kodunda, önce varsayılan UTC varsayımını kullanarak milisaniyeleri ayrıştırdığımıza dikkat edin. Ardından, ikinci olarak, ayarlanacak bir Paris saat dilimi atarız. Evrenin zaman çizelgesinde aynı an, ancak farklı duvar saati zamanı . Gösteri için tekrar UTC'ye ayarlıyoruz. İstediğiniz / beklenen saat dilimini açıkça belirtmek, örtük bir varsayılana (genellikle tarih-saat çalışmasındaki sorunun nedeni) güvenmek yerine, hemen hemen her zaman daha iyidir.
Bir DateTime oluşturmak için milisaniyeye ihtiyacımız var. Öyleyse, saniye girdinizi alın ve bin ile çarpın. long
32-bit'i aşacağımız için sonucun 64-bit olması gerektiğini unutmayın 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".
Yapıcıya milisaniye sayısını besleyin. Söz konusu kurucu, sayının 1970 Unix döneminden olduğunu varsayar. Bu nedenle, inşaattan sonra saat dilimini istediğiniz gibi ayarlayın.
Uygun saat dilimi adlarını, kıta ve şehir / bölge kombinasyonunu kullanın . EST
Standartlaştırılmadıkları veya benzersiz olmadığı için asla 3 veya 4 harfli kodlar kullanmayın .
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Gösteri için saat dilimini tekrar ayarlayın.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Konsola boşaltın. Yeni gün Avrupa'da başladı ama henüz Amerika'da olmadığı için Montréal'de tarihin ne kadar farklı olduğuna dikkat edin.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Çalıştırıldığında.
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
Joda-Time'ın yapımcıları , uygun olan en kısa sürede onun yerine geçen java.time çerçevesine geçmemizi istediler . Joda-Time aktif olarak desteklenmeye devam ederken, gelecekteki tüm geliştirmeler java.time sınıfları ve ThreeTen-Extra projesindeki uzantıları üzerinde yapılacaktır.
Java zamanı çerçevesi, JSR 310 tarafından tanımlanır ve Java 8 ve sonrasında yerleşiktir. Java.time sınıfları, ThreeTen-Backport projesinde Java 6 ve 7'ye ve ThreeTenABP projesinde Android'e geri taşındı .
An Instant
, nanosaniye çözünürlükle UTC'de zaman çizelgesindeki bir andır . Çağı, UTC'de 1970'in ilk anıdır.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
UTC'den sapma uygulayarak ZoneOffset
bir OffsetDateTime
.
Daha da iyisi, eğer biliniyorsa, ZoneId
bir ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );