Java'da “unixtime” alma


258

Date.getTime () 1 Ocak 1970'den bu yana milisaniye döndürür. Unixtime 1 Ocak 1970'den bu yana saniyelerdir. Genellikle java'da kod yazmıyorum, ancak bazı hata düzeltmeleri üzerinde çalışıyorum. Sahibim:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Java'da unixtime almanın daha iyi bir yolu var mı?


27
Bir int'e yayınladığınızdan, 2038 yılı sorununu (Unix için Y2K'ya eşdeğer) tanıttınız. İşte o zaman Unix dönemi 2 milyar dolara ulaştı ve negatif oldu. Çözüm 64 bit Unix'e geçmektir. Java eşdeğeri onu uzun süre bırakmaktır.
John M

1
Evet, bunun farkındayım. Bu arabirim, kod unixtime için 32bit int bekliyor.
Gary Richardson

158
2038 çok yakında.
Pacerier

CurrentTimeMillis için uygun bir ad veya standart var mı? Belgelerimde UNIX zamanının milisaniye versiyonu olarak söz etme eğilimindeyim.
Tom

1
Eğer yazılım taşması, kullanımı hayatta istiyorsanız long, değil int. int1 saniye = 4 saniye vb. Gibi farklı bir ayrıntı düzeyi kullanmadığınız sürece, zaman damgası kullanmak için hiçbir neden yoktur . Ya bu ya da kodunuzu gizleyin, böylece gelecek nesiller ne kadar beceriksiz olduğunuzu göremez.
bryc

Yanıtlar:


475

System.currentTimeMillis () ile Date nesnesi oluşturma işleminden kaçının . 1000'e bölmek seni Unix dönemine götürür.

Bir yorumda belirtildiği gibi, genellikle unixTime değişkeninin türü için uzun bir kutulu nesne (büyük-uzun L) değil, ilkel bir uzun (küçük harf-l uzun) olmasını istersiniz.

long unixTime = System.currentTimeMillis() / 1000L;

3
Ayrıca, numarayı bir Nesne olarak işlemek istemiyorsanız (Koleksiyona koymak gibi), uzun süre otomatik kutulama yerine ilkel uzun kullanmayı düşünün, yine gereksiz nesne oluşturmayı önler
brabster

9
Java 32 bit int, 32 bit platformlarla (ve yıl 2038 sorunuyla) eşleşir. 64 bit platformlar daha büyük bir time_t veri türü kullanır. Java, System.currentTimeMillis () için döndürdüğü sürece bu madde işaretinden kaçtı. İnt'ye dönüştürürseniz, 2038 yılı sorununu yeniden tanımlıyorsunuz. Bkz. En.wikipedia.org/wiki/Year_2038_problem#Solutions
John M

1
Sanırım bir noktada yanılıyorsunuz: Küçük harf "L" ile büyük harf arasında bir fark yoktur. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
mat forsythe

5
Büyük / küçük harf tartışması (yukarıda açıklanmıştır) veri türü ile ilgilidir. İlkel "uzun" ve "java.lang.Long" sınıfı örneği. Uzun harfli son ek mektubu hakkında konuşuyorsunuz, kabul ediyorum ki büyük ya da küçük harf olabilir. Küçük harf "l", "1" rakamına çok benziyor olsa da, "L" harfini kullanmak çok daha okunabilir.
John M

1
Belgelerin bağlantısını tıklayın. Dönüş, UTC saat diliminde 1/1/1970 tarihinden bu yana geçen milisaniye sayısı olarak tanımlanır. Zaman dilimi ister misin? Java.util.Calendar adresine bakın.
John M

274

Java 8, tarih ve saatlerle çalışmak için yeni bir API ekledi. Java 8 ile şunları kullanabilirsiniz:

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()geçerli sistem saatini temsil eden bir Anında Arama döndürür . İle getEpochSecond()çağdan saniye (unix zaman) Instant.


4
Ne arasındaki farktır Instant.now().getEpochSecond(), new Date().getTime()veSystem.currentTimeMillis()
SohamC

2
Bir fark, birincinin saniye olması, ikincisinin milisaniye olması. Başkaları olabilir ya da olmayabilir.
super_aardvark

3
import java.time.InstantScala'daysanız
akauppi

4
Ayrıntılı açıklama için bu siteyi de kontrol edin ... Hoşlandım .. currentTimeMillis
Subroto

1
Bu yöntemi eski android API Seviyeleri ile kullanamayacağınızı unutmayın.
Ali Nadalizadeh
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.