tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
Varsayılan saat dilimi için ana bilgisayar işletim sistemine veya JVM'ye bağlı olmaktan kaçının
İstenen / beklenen saat dilimini açıkça belirtmek için tüm kodunuzu yazmanızı tavsiye ederim. JVM'nin mevcut varsayılan saat dilimine bağlı olmanız gerekmez. Ve JVM'nin geçerli varsayılan saat diliminin , herhangi bir uygulama çağrısının herhangi bir iş parçacığındaki herhangi bir kodla, çalışma süresi sırasında herhangi bir anda değişebileceğini unutmayın TimeZone.setDefault
. Böyle bir çağrı, o JVM içindeki tüm uygulamaları hemen etkiler.
java.time
Diğer Cevaplardan bazıları doğruydu, ancak artık modası geçmiş durumda. Java'nın en eski sürümleriyle birlikte verilen korkunç tarih-saat sınıfları, tarih-saat işlemenin karmaşıklıklarını ve inceliklerini anlamayan insanlar tarafından yazılmış, kusurluydu.
Eski tarih-saat sınıflarının yerini , JSR 310'da tanımlanan java.time sınıfları almıştır .
Bir saat dilimini temsil etmek için kullanın ZoneId
. UTC'den uzaklığı temsil etmek için kullanın ZoneOffset
. Bir sapma, yalnızca ana meridyenin önünde veya arkasında birkaç saat-dakika-saniye sayısıdır. Bir saat dilimi çok daha fazlasıdır. Bir saat dilimi, belirli bir bölgedeki insanlar tarafından kullanılan farkın geçmiş, şimdiki ve gelecekteki değişikliklerinin geçmişidir.
Zamanla ilgili herhangi bir işlemi GMT / UTC'ye zorlamam gerekiyor
Sıfır saat-dakika-saniye farkı için sabiti kullanın ZoneOffset.UTC
.
Instant
Geçerli anı UTC'de yakalamak için bir Instant
. Bu sınıf, UTC'de bir anı temsil eder, tanımı gereği her zaman UTC'dir.
Instant instant = Instant.now() ;
ZonedDateTime
Aynı anı, belirli bir bölgedeki insanlar tarafından kullanılan duvar saati zamanına göre görmek için, bir saat dilimine ayarlayın. Aynı an, zaman çizelgesinde aynı nokta, farklı duvar saati zamanı.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Veri tabanı
Bir veritabanından bahsediyorsunuz.
Veritabanından bir anı geri almak için, sütununuz SQL standardına benzer bir veri türünde olmalıdır TIMESTAMP WITH TIME ZONE
. Bir dizeden ziyade bir nesneyi alın. JDBC 4.2 ve sonrasında, java.time nesnelerini veritabanı ile değiştirebiliriz. OffsetDateTime
İse, JDBC gereklidir Instant
ve ZonedDateTime
isteğe bağlıdır.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Çoğu veritabanında ve sürücüde, UTC'de görüldüğü gibi anı alacağınızı tahmin ediyorum. Ancak değilse, iki yoldan birini kullanarak ayarlama yapabilirsiniz:
- A'yı çıkarın
Instant
: odt.toInstant()
- Verilen ofsetten sıfır ofsetine ayarlayın: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
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
.
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 .
Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .
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?