2012-12-07 26 views
25

İki tarihi karşılaştırmak istiyorum, ancak sorun yaşıyorum. 1 date, java.util.date nesnesinden oluşturulur ve diğeri el ile oluşturulur.Joda saatini kullanarak iki tarihin karşılaştırılması

Date ds = new Date(); 
DateTime d = new DateTime(ds); 

DateTime e = new DateTime(2012,12,07, 0, 0); 
System.out.println(d.isEqual(e)); 

Test false çıkıyor Ancak: Aşağıdaki kod bir örnektir. Bunun zaman yüzünden olduğunu tahmin ediyorum. Bu iki tarihin birbirine eşit olup olmadığını nasıl kontrol edebilirim (Yıl, ay, tarih aynıdır)?

+0

Bilginize bkz olabilir [Joda-Time] (http://www.joda.org/joda-time/) proje şu anda [java.time] 'a geçişi öneren ekiple birlikte [bakım modu]' nda (https://en.wikipedia.org/wiki/Maintenance_mode) : //docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) sınıfları. Bkz. [Oracle Tutorial] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

cevap

44
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

veya

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 
+5

toDateMidnight(), kullanımdan kaldırılmıştır ve kullanılmamalıdır.Bunun yerine, TimeAtStartOfDay() ile kullanılabilir, ancak hala en uygun değildir, çünkü saat dilimini kaldırmaz, bu nedenle iki tarih farklı saat dilimlerine sahipse, asla eşit olmazlar. – Stan

+3

Ben aynı soruna sahip olduğunu farz edelim toLocalDate() 'kullanıyorum. Bundan kaçınmak için 'withZone() ', örneğin: d.toLocalDate(). IsEqual (e.withZone (d.zone) .toLocalDate())' ile zincirleme yapabileceğinizi tahmin ediyorum. Bunun _not_ test edildiğini unutmayın. –

+1

d ve e farklı saat dilimlerindeyse bu çalışmaz. Yukarıdaki Charles Wood'un cevabı daha güvenilir –

1

Bunlar DateTime nesneleri oldukları için, zaman bölümleri de bunları karşılaştırırken dikkate alınır. Zaman bileşenlerini göz ardı etmek istiyorsanız kendi yöntem yazın

d = d.withTime(0, 0, 0, 0); 
-5

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

Türleri aynı, soruları dikkatle okuyun. İkisi de DateTime. –

+2

Bu, Joda Time'ın tam olarak bu tür bir şeyi yapan bir dizi yardımcı yönteme sahip olduğundan, bu tamamen gereksizdir. –

3

: gibi 0'a ilk buluşma zamanı parçalarını ayarlamayı deneyin (yani sadece tarihleri ​​karşılaştırmak isterseniz) Date Time gece yerine DateMidnight sınıfını kullanabilirsiniz. Yani örnek şu şekilde görünecektir:

Date ds = new Date(); 
DateMidnight d = new DateMidnight(ds); 

DateMidnight e = new DateMidnight(2012, 12, 7); 
System.out.println(d.isEqual(e)); 

Ama, aynı zamanda dikkat, sadece bugün :)

"gerçek" yazdırır dikkat o DateTime (varsayılan JDK Tarih ve tüm Joda-Time anlık sınıflar tarafından ve DateMidnight dahil) varsayılan saat dilimi kullanılarak oluşturulur. Kodla karşılaştırmak için bir tarih oluşturursanız, ancak muhtemelen UTC'de tarihleri ​​depolayan DB'den bir tane daha alırsanız, UTC saat diliminde olmadığınızı varsayarak tutarsızlıklarla karşılaşabilirsiniz.

date1.toLocalDate().isEqual(date2.toLocalDate()) 

Bu

DateTime Zaman kısmının kurtulacaksınız:

+0

DateMidnight paket saatinde önerilmemektedir önerisi localDate –

+0

kullanmaktır. Tüm gece yarısı ile ilgili sınıflar ve yöntemler ve yöntemler, "günün ilk anı" kavramı ve yöntemleri tarafından kaldırılır. –

15

Sen toLocalDate() kullanmalıdır.

Orada başka bir yaklaşımdır, ama iki tarihleri ​​farklı saat dilimine sahip durumda dikkate almaz, bu yüzden daha az güvenilirdir:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

Bu bir Benim için çalışan statik yöntem.

public static boolean isSameDay(DateTime date1, DateTime date2){ 
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()); 
} 
+0

[toLocalDate] öğesini kullanarak [varolan Yanıt] (https://stackoverflow.com/a/21553438/642706) avantajını göremiyorum. Bunun dışında, 'DateTime' nesneleri farklı saat dilimlerine sahipse, diğer Cevap'ın yaklaşımı ise başarısız olur. Bunun iyi ya da kötü olup olmadığı iş sorununa bağlıdır. –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1 ve obj2 ayrıntılar için bir String, Uzun, Tarih (java.util) ... http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

Yığın Taşmasına Hoş Geldiniz! Bir soruya cevap vermeden önce, her zaman mevcut cevapları okuyun. Bu cevap zaten sağlandı. Cevabı tekrarlamak yerine, mevcut cevabı bir oy verin. İyi cevaplar yazmanın bazı yönergelerini burada bulabilirsiniz (https://stackoverflow.com/help/how-to-answer). – dferenc

İlgili konular