Joda-Time
Bir bağımlılık eklemek gelince, java.util.Date & .Calendar gerçekten çok kötü, herhangi bir yeni projeye yaptığım ilk şey Joda-Time kütüphanesini eklemek. Java 8'de Joda-Time'dan esinlenen yeni java.time paketini kullanabilirsiniz.
Joda-Time'ın çekirdeği DateTime
sınıftır. Java.util.Date öğesinin aksine, atanmış saat dilimini ( DateTimeZone
) anlar . JuDate'den dönüştürme yaparken bir bölge atayın.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
Aynı tarihte iki tarih saatinin gelip gelmediğini doğrulamanın bir yolu, LocalDate
nesnelere dönüştürmektir .
Bu dönüşüm, atanan saat dilimine bağlıdır. LocalDate
Nesneleri karşılaştırmak için, aynı bölgeye dönüştürülmüş olmaları gerekir.
İşte küçük bir yardımcı yöntem.
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
İlk DateTime nesnesinin saat diliminin kullanılması gerektiğini varsaymak yerine saat dilimini belirten başka bir argüman daha iyi olur.
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
Dize Temsili
Diğer bir yaklaşım, her bir tarih-saatin tarih bölümünün dize olarak temsilini oluşturmak ve ardından dizeleri karşılaştırmaktır.
Yine, atanan saat dilimi çok önemlidir.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
Zaman Aralığı
Genelleştirilmiş çözüm bir zaman aralığı tanımlamak, sonra açıklığın hedefinizi içerip içermediğini sormaktır. Bu örnek kod Joda-Time 2.4'te verilmiştir. "Gece yarısı" ile ilgili sınıfların kullanımdan kaldırıldığını unutmayın. Bunun yerine withTimeAtStartOfDay
yöntemi kullanın . Joda-Time, çeşitli zaman aralıklarını temsil etmek için üç sınıf sunar: Aralık, Dönem ve Süre.
Açıklığın başlangıcını ve sonunun münhasır olduğu "Yarı Açık" yaklaşımını kullanmak.
Hedefin saat dilimi, aralığın saat diliminden farklı olabilir.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8 ve üstü java.time çerçevesiyle birlikte gelir . JSR 310 tarafından tanımlanan ve ThreeTen-Extra projesi tarafından genişletilen Joda-Time'dan esinlenmiştir. Eğiticiye Bakın .
Joda-Time'ın yapımcıları bize en kısa sürede java.time'a geçmemizi söylediler. Bu arada Joda-Time aktif olarak sürdürülen bir proje olarak devam ediyor. Ancak gelecekteki çalışmaların Joda-Time yerine yalnızca java.time ve ThreeTen-Extra'da gerçekleşmesini bekleyin.
Özetle java.time özetlemek gerekirse… An Instant
UTC zaman çizelgesinde bir andır. Nesneyi ZoneId
almak için saat dilimi ( ) uygulayın ZonedDateTime
. Bir tarih-zaman muğlak belirsiz fikir edinmek için, zaman çizelgesi kapalı taşımak için, "Yerel" sınıflarını kullanın: LocalDateTime
, LocalDate
,LocalTime
.
Bu Yanıtın Joda-Time bölümünde tartışılan mantık java.time için geçerlidir.
Eski java.util.Date sınıfının toInstant
java.time biçimine dönüştürmek için yeni bir yöntemi vardır.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
Tarih belirlemek için saat dilimi gerekir.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
Bir saat Instant
elde etmek için bu saat dilimi nesnesini ZonedDateTime
. Bundan, LocalDate
hedefimiz tarihleri karşılaştırmak (yalnızca saat, dakika vb. Değil) için yalnızca tarih (a ) değerini alırız.
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
java.util.Date
Karşılaştırma için ihtiyacımız olan ikinci nesneye de aynısını yapın . Bunun yerine sadece şu anı kullanacağım.
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
isEqual
Aynı tarih değerini test etmek için özel yöntemi kullanın .
Boolean sameDate = localDate1.isEqual( localDate2 );