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/Regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland. Hiçbir zaman gibi 2-4 harfli bir kısaltma kullanın ESTveya ISToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Uygula ZoneIdiçin Instantbir 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. LocalTimeGünün tüm zaman bölümlerini değiştirmek için a uygulayın : saat, dakika, saniye, kesirli saniye. ZonedDateTimeOrijinali 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.DateHenüz java.time olarak güncellenmemiş eski kodla birlikte çalışmanız gerekiyorsa ,.
java.util.Date d = java.util.Date.from( instant ) ;