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 Instantve ZonedDateTimeisteğ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?