tl; Dr.
myJavaUtilDate // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant() // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate() // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) ) // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.
java.time
Yıllar önce JSR 310'da tanımlanan modern java.time sınıfları tarafından değiştirilen korkunç eski tarih-saat sınıflarını kullanıyorsunuz .
Date
➙ Instant
A java.util.Date
, UTC'de bir anı temsil eder. Onun yerini alır Instant
. Eski sınıflara eklenen yeni dönüştürme yöntemlerini çağırın.
Instant instant = myJavaUtilDate.toInstant() ;
Saat dilimi
Yeni günün saatinin anlamlı olmasını istediğiniz saat dilimini belirtin.
Bir belirtme uygun bir zaman dilimi adı biçiminde Continent/Region
gibi America/Montreal
, Africa/Casablanca
ya da Pacific/Auckland
. Hiçbir zaman gibi 2-4 harfli bir kısaltma kullanın EST
veya IST
oldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Uygula ZoneId
için Instant
bir olsun ZonedDateTime
. Aynı an, zaman çizelgesinde aynı nokta, ancak farklı duvar saati zamanı.
ZonedDateTime zdt = instant.atZone( z ) ;
Günün saatini değiştirme
Günün saatini değiştirmek istedin. LocalTime
Günün tüm zaman bölümlerini değiştirmek için a uygulayın : saat, dakika, saniye, kesirli saniye. ZonedDateTime
Orijinali temel alan değerlerle yeni bir örnek oluşturulur . Java.time sınıfları bu kullanımı Değişken olmayan objeler sağlamak için model iplik güvenlik .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Günün ilk anı
Ama özellikle 00: 00'ı istedin. Görünüşe göre günün ilk anını istiyorsun. Dikkat: Bazı bölgelerdeki bazı günler 00: 00: 00'da başlamaz. Yaz Saati Uygulaması (DST) gibi anormallikler nedeniyle 01:00:00 gibi başka bir saatte başlayabilirler.
Bırakın java.time ilk anı belirlesin . Yalnızca tarih bölümünü çıkarın. Ardından, ilk anı almak için saat dilimini geçin.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
UTC'ye ayarlayın
UTC'ye geri dönmeniz gerekiyorsa, bir Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
java.util.Date
Henüz java.time olarak güncellenmemiş eski kodla birlikte çalışmanız gerekiyorsa ,.
java.util.Date d = java.util.Date.from( instant ) ;