tl; Dr.
Joda-Time projesi artık supplanted bakım modunda olduğu java.time sınıfları.
- Sadece
java.time.Instant
sınıfı kullanın .
- İhtiyaç yok:
LocalDateTime
java.sql.Timestamp
- Teller
Geçerli anı UTC olarak yakalayın.
Instant.now()
O anı veritabanında saklamak için:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
O anı veri tabanından almak için:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Duvar saatini belirli bir zaman dilimine ayarlamak için.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
yanlış sınıf
Diğer Cevaplar doğrudur, ancak LocalDateTime
amacınız için yanlış sınıf olduğunu belirtmekte başarısız olurlar .
İkisinde de java.time ve Joda-Time , bir LocalDateTime
kasten herhangi bir zaman diliminde kavramını ya yoksun ofset-den-UTC. Böyle olunca yok değil bir an temsil eder ve olduğu değil çizelgesinde bir nokta. A , yaklaşık 26-27 saatlik bir aralıktaki potansiyel anlar LocalDateTime
hakkında kaba bir fikri temsil eder .
Bir kullan LocalDateTime
için ya ofset bölge / (değil iyi bir durum) bilinmemektedir veya bölge-ofset zaman belirsiz olduğunda. Örneğin, "Noel 25 Aralık 2018’in ilk anında başlıyor", bir LocalDateTime
.
ZonedDateTime
Belirli bir saat dilimindeki bir anı temsil etmek için a kullanın . Örneğin, Noel gibi belirli bir bölgede başlar Pacific/Auckland
veya America/Montreal
bir ZonedDateTime
nesneyle temsil edilir .
Bir an için her zaman UTC'de kullanın Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Bir saat dilimi uygulayın. Aynı an, zaman çizelgesinde aynı nokta, ancak farklı bir duvar saati ile görüntülendi.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Yani, LocalDate ve LocalDateTime arasında dönüşüm yapabilirsem,
Hayır, yanlış strateji. Yalnızca tarih değeriniz varsa ve tarih-saat değeri istiyorsanız, günün saatini belirtmelisiniz. Bu günün saati belirli bir bölge için o tarihte geçerli olmayabilir - bu durumda ZonedDateTime
sınıf, günün saatini gerektiği gibi otomatik olarak ayarlar.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Günün ilk anını günün saati olarak istiyorsanız, bırakın java.time o anı belirlesin . Günün 00: 00: 00'da başladığını varsaymayın. Yaz Saati Uygulaması (DST) gibi anormallikler, günün 01:00:00 gibi başka bir saatte başlayabileceği anlamına gelir.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
yanlış sınıf
java.sql.Timestamp
Tamamen supplanted şimdi eski olan zahmetli eski tarih-saat sınıfların bir parçasıdır java.time sınıfları. Bu sınıf, UTC'de nanosaniye çözünürlükte bir anı temsil etmek için kullanıldı . Bu amaca artık hizmet ediliyor java.time.Instant
.
JDBC 4.2, getObject
/setObject
İtibariyle JDBC 4.2 ve üstü, senin JDBC sürücüsü doğrudan java.time arayarak veritabanı ile nesneleri alışverişi yapabilir:
Örneğin:
myPreparedStatement.setObject( … , instant ) ;
… ve …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Mirası, moderni dönüştür
Henüz java.time ile güncellenmemiş eski kodla arayüz yapmanız gerekiyorsa , eski sınıflara eklenen yeni yöntemleri kullanarak ileri geri dönüştürün.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…ve…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
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
.
Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi tavsiye ediyor .
Daha fazla bilgi edinmek için Oracle Eğitimi'ne 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 üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*
Java.time derslerini nereden edinebilirim?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time uygulamasına gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .
java.sql.Timestamp
sınıf artık miras olup, java.time sınıfları, özellikleInstant
.