tl; Dr.
Eskimiş java.util.Date
nesnelerini onların yerine dönüştür java.time.Instant
. Sonra geçen süreyi a olarak hesaplayın Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
ISO 8601 Biçimi: PnYnMnDTnHnMnS
Mantıklı standart ISO 8601 tanımlar birkaç yıl gibi uzun bir zaman dilimi bir kısa metin gösterimi, ay, gün, saat, vb standart çağrılar, örneğin bir yayılma bir süre . Biçimdir PnYnMnDTnHnMnS
nerede P
vasıta "Dönem", T
zaman kısmından tarih bölümünü ayırır ve bir harf tarafından takip sayılardır arasında.
Örnekler:
P3Y6M4DT12H30M5S
üç yıl, altı ay, dört gün, on iki saat, otuz dakika ve beş saniye
PT4H30M
Dört buçuk saat
java.time
Java.time sonra Java 8 yerleşik ve çerçeve zahmetli eski yerine alır java.util.Date
/ java.util.Calendar
sınıfları. Yeni sınıflar , halefi olarak düşünülen, konseptte benzer ancak yeniden tasarlanmış , son derece başarılı Joda-Time çerçevesinden ilham alıyor . JSR 310 tarafından tanımlanmıştır . ThreeTen-Extra projesi ile genişletildi . Eğiticiye bakın .
An
Instant
Sınıfı zaman çizelgesinde bir anı temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Date
/ Gibi eski sınıflardan kaçınmak en iyisidir Calendar
. Ancak, java.time için henüz güncellenmemiş eski kodlarla birlikte çalışmanız gerekiyorsa , ileri geri dönüş yapın. Eski sınıflara eklenen yeni dönüşüm yöntemlerini çağırın. A 'dan a' ya java.util.Date
geçmek için Instant
arayın Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Zaman aralığı
Java.time sınıfları, bir süreyi birkaç yıl, ay, gün, saat, dakika, saniye olarak temsil etme fikrini iki yarıya bölmüştür:
Period
yıllarca, aylarca, günlerce
Duration
günler, saatler, dakikalar, saniyeler için
İşte bir örnek.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Konsola dökümü.
Her ikisi de Period
ve değerlerinin bir String temsilini oluşturmak Duration
için ISO 8601 standardını kullanır .
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
şimdi: 2015-11-26T00: 46: 48.016-05: 00 [Amerika / Montreal] gelecek: 2015-11-26T00: 46: 48.016-05: 00 [Amerika / Montreal] = PT1H3M
Java 9 Duration
, gün bölümü, saat bölümü, dakika bölümü ve saniye bölümü almak için yöntemler ekler .
Tüm Süre boyunca toplam gün veya saat veya dakika veya saniye veya milisaniye veya nanosaniye alabilirsiniz.
long totalHours = duration.toHours();
Java 9'da Duration
sınıf gün, saat, dakika, saniye, milisaniye / nanosaniyenin çeşitli bölümlerini döndürmek için yeni yöntemler alır . to…Part
Yöntemleri çağırın : toDaysPart()
,, toHoursPart()
vb.
ChronoUnit
“Geçen gün sayısı” gibi yalnızca daha basit bir ayrıntı düzeyini önemsiyorsanız, numarayı kullanın ChronoUnit
.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Başka bir örnek.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Java.time hakkında
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'a 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 .
Java.time sınıflarını nereden edinebilirsiniz?
- Java SE 8 ve SE 9 ve üstü
- Dahili.
- Paketlenmiş bir uygulamaya sahip standart Java API'sinin bir parçasıdır.
- Java 9 bazı küçük özellikler ve düzeltmeler ekler.
- Java SE 6 ve SE 7
- Android
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. Aşağıdaki gibi burada bazı yararlı sınıfları bulabilir Interval
, YearWeek
,YearQuarter
, ve daha .
Joda-Time
GÜNCELLEME: Joda-Time projesi artık bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Bu bölümü tarih için olduğu gibi bırakıyorum.
Joda-Time kütüphanesi, varsayılan değerleri için ISO 8601 kullanır. OnunPeriod
sınıf ayrıştırır ve bu PnYnMnDTnHnMnS dizeleri üretir.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
çizer:
period: PT4H30M