tl; dr
java.util.Date.from(
Instant.now() ;
)
Yukarıdaki kodun hiçbir anlamı olmamasına rağmen. Her ikisi java.util.Date
ve Instant
her zaman UTC'de, UTC'de bir anı temsil eder. Yukarıdaki kod şununla aynı etkiye sahiptir:
new java.util.Date()
Burada kullanmanın bir faydası yok ZonedDateTime
. Zaten bir hesabınız varsa ZonedDateTime
, a'yı çıkararak UTC'ye ayarlayın Instant
.
java.util.Date.from(
myZonedDateTime.toInstant()
)
Diğer Cevap Doğru
Cevap tarafından ssoltanid doğru yeni bir okul java.time nesneyi (dönüştürmek için nasıl özel soru adresleri ZonedDateTime
eski bir okul için) java.util.Date
nesne. Instant
ZonedDateTime öğesinden ayıklayın ve java.util.Date.from()
.
Veri kaybı
Eğer edeceği Not veri kaybına acı gibi Instant
parçalar nanosaniye beri çağın ederken java.util.Date
izler milisaniye Dönemden beri.
Sorunuz ve yorumlarınız başka sorunları da beraberinde getiriyor.
Sunucuları UTC'de Tutun
Genel olarak en iyi uygulama olarak sunucularınızın ana işletim sistemi UTC'ye ayarlanmış olmalıdır. JVM, bildiğim Java uygulamalarında bu ana işletim sistemi ayarını varsayılan saat dilimi olarak alıyor.
Saat Dilimini Belirtin
Ancak hiçbir zaman JVM'nin geçerli varsayılan saat dilimine güvenmemelisiniz. Ana bilgisayar ayarını almak yerine, bir JVM başlatılırken geçirilen bir bayrak başka bir saat dilimi ayarlayabilir. Daha da kötüsü: Herhangi bir uygulamanın herhangi bir iş parçacığındaki herhangi bir kod java.util.TimeZone::setDefault
, çalışma zamanında bu varsayılanı değiştirmek için bir çağrı yapabilir !
Cassandra Timestamp
Türü
Herhangi bir düzgün veritabanı ve sürücü, depolama için geçirilen bir tarih-saati UTC'ye otomatik olarak ayarlamalıdır. Cassandra kullanmıyorum, ancak tarih saati için bazı temel destekleri var gibi görünüyor. Belgeler, Timestamp
türünün aynı dönemden milisaniye sayısı olduğunu söylüyor (UTC'de 1970'in ilk anı).
ISO 8601
Ayrıca Cassandra, ISO 8601 standart formatlarında dizi girişlerini kabul eder . Neyse ki, java.time dizeleri ayrıştırmak / oluşturmak için varsayılan olarak ISO 8601 biçimlerini kullanır. Instant
Sınıfının toString
uygulaması güzel yapacağız.
Hassasiyet: Milisaniye - Nanosecord
Ama önce ZonedDateTime'ın nanosaniye hassasiyetini milisaniyeye indirmemiz gerekiyor. Bunun bir yolu, milisaniyeleri kullanarak yeni bir Anında Arama oluşturmaktır. Neyse ki, java.time, milisaniyeye ve milisaniyeden dönüştürme için bazı kullanışlı yöntemlere sahiptir.
Örnek Kod
İşte Java 8 Güncellemesi 60'daki bazı örnek kod.
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
Instant instant = zdt.toInstant();
Instant instantTruncatedToMilliseconds = Instant.ofEpochMilli( instant.toEpochMilli() );
String fodderForCassandra = instantTruncatedToMilliseconds.toString();
Veya bu Cassandra Java sürücü belgesine göre , bir java.util.Date
örneği geçirebilirsiniz (karıştırılmamalıdır java.sqlDate
). Böylece instantTruncatedToMilliseconds
yukarıdaki koddan bir juDate yapabilirsiniz .
java.util.Date dateForCassandra = java.util.Date.from( instantTruncatedToMilliseconds );
Bunu sık sık yapıyorsanız, tek astar yapabilirsiniz.
java.util.Date dateForCassandra = java.util.Date.from( zdt.toInstant() );
Ancak küçük bir fayda yöntemi oluşturmak daha iyi olurdu.
static public java.util.Date toJavaUtilDateFromZonedDateTime ( ZonedDateTime zdt ) {
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
Sorudakinden farklı olarak tüm bu koddaki farklılığa dikkat edin. Sorunun kodu, ZonedDateTime örneğinin saat dilimini UTC'ye ayarlamaya çalışıyordu. Ancak bu gerekli değildir. Kavramsal olarak:
ZonedDateTime = Instant + ZoneId
Zaten UTC'de olan Anında bölümünü çıkarıyoruz (temelde UTC'de, kesin ayrıntılar için sınıf belgesini okuyun).
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 sınıflarını 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.util.Date
vejava.sql.Date
.