मैं एक तुलना विधि है कि एक java.util.Date के समय भाग को नजरअंदाज करना चाहते हैं। मुझे लगता है कि इसे हल करने के कई तरीके हैं। सबसे आसान तरीका क्या है?
मैं एक तुलना विधि है कि एक java.util.Date के समय भाग को नजरअंदाज करना चाहते हैं। मुझे लगता है कि इसे हल करने के कई तरीके हैं। सबसे आसान तरीका क्या है?
जवाबों:
अपडेट: जबकि उस समय जोडा टाइम एक अच्छी सिफारिश थी, java.timeजहां संभव हो वहां जावा 8+ से लाइब्रेरी का उपयोग करें ।
मेरी प्राथमिकता जोडा समय का उपयोग करना है जो इसे अविश्वसनीय रूप से आसान बनाता है:
DateTime first = ...;
DateTime second = ...;
LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();
return firstDate.compareTo(secondDate);
संपादित करें: जैसा कि टिप्पणियों में कहा गया है, यदि आप इसका उपयोग करते हैं तो DateTimeComparator.getDateOnlyInstance()यह और भी आसान है :)
// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);
("Joda Time का उपयोग करें" लगभग सभी SO प्रश्नों का आधार है जो इसके बारे में पूछते हैं java.util.Dateया java.util.Calendarयह पूरी तरह से बेहतर API है। यदि आप तारीखों / समय के साथ कुछ भी महत्वपूर्ण कर रहे हैं , तो आपको वास्तव में इसका उपयोग करना चाहिए यदि आप संभवतः कर सकते हैं।)
यदि आप बिल्ट इन एपीआई का उपयोग करने के लिए पूरी तरह से मजबूर हैं , तो आपको Calendarउपयुक्त तिथि के साथ और उचित समय क्षेत्र का उपयोग करके एक उदाहरण बनाना चाहिए । तब आप प्रत्येक कैलेंडर में प्रत्येक क्षेत्र को घंटे, मिनट, सेकंड और मिलीसेकंड से 0 तक सेट कर सकते हैं और परिणामी समय की तुलना कर सकते हैं। हालांकि निश्चित रूप से Joda समाधान के साथ तुलना icky :)
समय क्षेत्र हिस्सा महत्वपूर्ण है: java.util.Dateहै हमेशा यूटीसी पर आधारित है। ज्यादातर मामलों में जहां मुझे एक तारीख में दिलचस्पी रही है, वह एक विशिष्ट समय क्षेत्र में एक तारीख है । यह अपने आप ही आपको उपयोग करने के लिए मजबूर कर देगा Calendarया जबड़ा समय (जब तक आप स्वयं समय क्षेत्र का हिसाब नहीं देना चाहेंगे, जिसकी मैं अनुशंसा नहीं करता हूं।)
Android डेवलपर्स के लिए त्वरित संदर्भ
//Add joda library dependency to your build.gradle file
dependencies {
...
implementation 'joda-time:joda-time:2.9.9'
}
नमूना कोड (उदाहरण)
DateTimeComparator dateTimeComparator = DateTimeComparator.getDateOnlyInstance();
Date myDateOne = ...;
Date myDateTwo = ...;
int retVal = dateTimeComparator.compare(myDateOne, myDateTwo);
if(retVal == 0)
//both dates are equal
else if(retVal < 0)
//myDateOne is before myDateTwo
else if(retVal > 0)
//myDateOne is after myDateTwo
अपाचे कॉमन्स-लैंग लगभग सर्वव्यापी है। तो इस बारे में क्या?
if (DateUtils.isSameDay(date1, date2)) {
// it's same
} else if (date1.before(date2)) {
// it's before
} else {
// it's after
}
यदि आप वास्तव में java.util.Date का उपयोग करना चाहते हैं, तो आप कुछ इस तरह करेंगे:
public class TimeIgnoringComparator implements Comparator<Date> {
public int compare(Date d1, Date d2) {
if (d1.getYear() != d2.getYear())
return d1.getYear() - d2.getYear();
if (d1.getMonth() != d2.getMonth())
return d1.getMonth() - d2.getMonth();
return d1.getDate() - d2.getDate();
}
}
या, के बजाय एक कैलेंडर का उपयोग कर (पसंदीदा, क्योंकि getYear () और ऐसे पदावनत हैं)
public class TimeIgnoringComparator implements Comparator<Calendar> {
public int compare(Calendar c1, Calendar c2) {
if (c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR))
return c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
if (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH))
return c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
return c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);
}
}
मेरी प्राथमिकता उपयोग करने के लिए किया जाएगा Joda के पुस्तकालय insetad java.util.Date, सीधे रूप में Joda दिनांक और समय (देखें के बीच एक अंतर बना देता है YearMonthDay और दिनांक समय वर्ग)।
हालाँकि, यदि आप उपयोग करना चाहते हैं, तो java.util.Dateमैं एक उपयोगिता विधि लिखने का सुझाव दूंगा; जैसे
public static Date setTimeToMidnight(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime( date );
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
इस विकल्प पर कोई राय?
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));
==ऑपरेटर जरूरी वापस नहीं करता trueबराबर स्ट्रिंग्स (उपयोग के लिए equals())। आप निश्चित रूप से आपके द्वारा उल्लिखित अन्य तुलना ऑपरेटरों का उपयोग नहीं कर सकते हैं।
sdf.format(date1).compareTo(sdf.format(date2));।
मैं भी Joda Time पसंद करता हूँ , लेकिन यहाँ एक विकल्प है:
long oneDay = 24 * 60 * 60 * 1000
long d1 = first.getTime() / oneDay
long d2 = second.getTime() / oneDay
d1 == d2
संपादित करें
यदि आप UTC के अलावा किसी अन्य विशिष्ट समयक्षेत्र के लिए दिनांक की तुलना करने की आवश्यकता है, तो मैं UTC बात को नीचे रखता हूँ। यदि आपके पास ऐसी कोई आवश्यकता है, हालांकि, तो मैं वास्तव में जोडा के लिए जाने की सलाह देता हूं।
long oneDay = 24 * 60 * 60 * 1000
long hoursFromUTC = -4 * 60 * 60 * 1000 // EST with Daylight Time Savings
long d1 = (first.getTime() + hoursFromUTC) / oneDay
long d2 = (second.getTime() + hoursFromUTC) / oneDay
d1 == d2
Math.abs(second.getTime() - first.getTime()) < 1000L*60*60*24
< oneDay।
myJavaUtilDate1.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
.isEqual (
myJavaUtilDate2.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
)
परेशान पुरानी विरासत तिथि-समय वर्गों जैसे Date& से बचें Calendar, अब java.time कक्षाओं द्वारा इसे दबा दिया गया।
एक java.util.DateUTC में समय रेखा पर एक पल के प्रतिनिधित्व करता है। Java.time में बराबर है Instant। आप विरासत वर्ग में जोड़े गए नए तरीकों का उपयोग करके परिवर्तित कर सकते हैं।
Instant instant1 = myJavaUtilDate1.toInstant();
Instant instant2 = myJavaUtilDate2.toInstant();
आप तारीख से तुलना करना चाहते हैं। एक तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि क्षेत्र के अनुसार दुनिया भर में भिन्न होती है। उदाहरण के लिए, पेरिस फ्रांस में आधी रात के कुछ मिनट बाद एक नया दिन है जबकि अभी भी "कल" मॉन्ट्रियल क्यूबेक में है ।
के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST
ZoneId z = ZoneId.of( "America/Montreal" );
पाने के ZoneIdलिए आवेदन करें ।InstantZonedDateTime
ZonedDateTime zdt1 = instant1.atZone( z );
ZonedDateTime zdt2 = instant2.atZone( z );
LocalDateवर्ग समय के दिन और समय क्षेत्र के बिना बिना एक दिनांक-केवल मूल्य का प्रतिनिधित्व करता। हम समय के हिस्से को प्रभावी ढंग से समाप्त करते हुए, ए LocalDateसे निकाल सकते ZonedDateTimeहैं।
LocalDate localDate1 = zdt1.toLocalDate();
LocalDate localDate2 = zdt2.toLocalDate();
अब की तुलना, जैसे तरीकों का उपयोग कर isEqual, isBeforeऔर isAfter।
Boolean sameDate = localDate1.isEqual( localDate2 );
इस कोड को IdeOne.com पर लाइव देखें ।
तत्काल 1: 2017-03-25T04: 13: 10.971Z | इंस्टेंट 2: 2017-03-24T22: 13: 10.972Z
zdt1: 2017-03-25T00: 13: 10.971-04: 00 [अमेरिका / मॉन्ट्रियल] | zdt2: 2017-03-24T18: 13: 10.972-04: 00 [अमेरिका / मॉन्ट्रियल]
localDate1: 2017-03-25 | localDate2: 2017-03-24
वहीडेट: झूठा
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
Java.time कक्षाएं कहाँ से प्राप्त करें?
ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक ।
पहले से ही अपाचे कॉमन्स-बर्तन का उल्लेख किया गया है :
org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)
आपको बिना समय के, केवल दिनांक वाली वस्तु देता है, और आप इसकी तुलना कर सकते हैं Date.compareTo
मुझे डर है कि दो तारीखों की तुलना करने का कोई तरीका नहीं है जिसे "आसान" या "सरल" कहा जा सकता है।
किसी भी प्रकार की कम सटीकता के साथ दो समय के उदाहरणों की तुलना करते समय (जैसे कि तारीखों की तुलना करना), आपको हमेशा इस बात का ध्यान रखना चाहिए कि समय क्षेत्र तुलना को कैसे प्रभावित करता है।
यदि date1एक घटना को निर्दिष्ट कर रहा है जो +2 टाइमज़ोन date2में हुई है और ईएसटी में हुई एक घटना को निर्दिष्ट कर रही है, उदाहरण के लिए, आपको तुलना के निहितार्थ को ठीक से समझने के लिए ध्यान रखना चाहिए।
क्या आपका उद्देश्य यह पता लगाने का है कि क्या दोनों घटनाएं एक ही कैलेंडर तिथि में अपने-अपने समय क्षेत्र में घटित हुई हैं? या क्या आपको यह जानने की जरूरत है कि क्या दो तिथियां एक विशिष्ट समय क्षेत्र (यूटीसी या आपके स्थानीय टीएजी में एक ही कैलेंडर तिथि में आती हैं, उदाहरण के लिए)।
एक बार जब आप समझ जाते हैं कि यह वास्तव में क्या है जिसकी आप तुलना करने की कोशिश कर रहे हैं, तो यह उचित समय क्षेत्र में वर्ष-माह-तारीख ट्रिपल प्राप्त करने की बात है और तुलना करें।
जोडा समय वास्तविक तुलना ऑपरेशन को अधिक साफ-सुथरा बना सकता है, लेकिन तुलना के शब्दार्थ अभी भी कुछ हैं जो आपको स्वयं पता लगाने की आवश्यकता है।
यदि आप जावा 8 का उपयोग कर रहे हैं, तो आपको java.time.*तारीखों की तुलना करने के लिए कक्षाओं का उपयोग करना चाहिए - यह विभिन्न java.util.*वर्गों को पसंद है
जैसे; https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
LocalDate date1 = LocalDate.of(2016, 2, 14);
LocalDate date2 = LocalDate.of(2015, 5, 23);
date1.isAfter(date2);
यदि आप बिना समय के केवल दो तिथियों की तुलना करना चाहते हैं, तो निम्नलिखित कोड आपकी सहायता कर सकते हैं:
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date dLastUpdateDate = dateFormat.parse(20111116);
Date dCurrentDate = dateFormat.parse(dateFormat.format(new Date()));
if (dCurrentDate.after(dLastUpdateDate))
{
add your logic
}
यहाँ इस ब्लॉग से एक समाधान है: http://brigitzblog.blogspot.com/2011/10/java-compare-d.net.html
long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.println("Time in days: " + diffDays + " days.");
यानी आप देख सकते हैं कि मिलीसेकंड में समय का अंतर एक दिन की लंबाई से कम है या नहीं।
मुझे नहीं पता कि यह नई सोच है या फिर, लेकिन मैं आपको दिखाता हूं जैसे मैंने किया था
SimpleDateFormat dtf = new SimpleDateFormat("dd/MM/yyyy");
Date td_date = new Date();
String first_date = dtf.format(td_date); //First seted in String
String second_date = "30/11/2020"; //Second date you can set hear in String
String result = (first_date.equals(second_date)) ? "Yes, Its Equals":"No, It is not Equals";
System.out.println(result);
केवल YEAR संपत्ति के साथ संयोजन में DAY_OF_YEAR की जाँच करें
boolean isSameDay =
firstCal.get(Calendar.YEAR) == secondCal.get(Calendar.YEAR) &&
firstCal.get(Calendar.DAY_OF_YEAR) == secondCal.get(Calendar.DAY_OF_YEAR)
संपादित करें:
अब हम कोटलिन एक्सटेंशन कार्यों की शक्ति का उपयोग कर सकते हैं
fun Calendar.isSameDay(second: Calendar): Boolean {
return this[Calendar.YEAR] == second[Calendar.YEAR] && this[Calendar.DAY_OF_YEAR] == second[Calendar.DAY_OF_YEAR]
}
fun Calendar.compareDatesOnly(other: Calendar): Int {
return when {
isSameDay(other) -> 0
before(other) -> -1
else -> 1
}
}
public Date saveDateWithoutTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime( date );
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
यह आपको समय पर विचार किए बिना तारीखों की तुलना करने में मदद करेगा।
SimpleDateFormat के getDateInstance का उपयोग करके, हम बिना समय के केवल दो दिनांक ऑब्जेक्ट की तुलना कर सकते हैं। नीचे दिए गए कोड को निष्पादित करें।
public static void main(String[] args) {
Date date1 = new Date();
Date date2 = new Date();
DateFormat dfg = SimpleDateFormat.getDateInstance(DateFormat.DATE_FIELD);
String dateDtr1 = dfg.format(date1);
String dateDtr2 = dfg.format(date2);
System.out.println(dateDtr1+" : "+dateDtr2);
System.out.println(dateDtr1.equals(dateDtr2));
}
Http://mvnrepository.com/artifact/commons-lang/commons-lang का उपयोग करना
Date date1 = new Date();
Date date2 = new Date();
if (DateUtils.truncatedCompareTo(date1, date2, Calendar.DAY_OF_MONTH) == 0)
// TRUE
else
// FALSE
DateUtils.isSameDay(date1, date2)।
यहाँ और मेरे संरक्षक मार्गदर्शन के जवाबों के आधार पर एक और सरल तुलना विधि
public static int compare(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c1.set(Calendar.MILLISECOND, 0);
c1.set(Calendar.SECOND, 0);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.HOUR_OF_DAY, 0);
c2.setTime(d2);
c2.set(Calendar.MILLISECOND, 0);
c2.set(Calendar.SECOND, 0);
c2.set(Calendar.MINUTE, 0);
c2.set(Calendar.HOUR_OF_DAY, 0);
return c1.getTime().compareTo(c2.getTime());
}
EDIT : @Jonathan Drapeau के अनुसार, ऊपर दिया गया कोड कुछ मामलों में विफल हो जाता है (मैं उन मामलों को देखना चाहता हूं, कृपया) और उन्होंने मुझे समझाते हुए निम्नलिखित सुझाव दिए:
public static int compare2(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.clear();
c2.clear();
c1.set(Calendar.YEAR, d1.getYear());
c1.set(Calendar.MONTH, d1.getMonth());
c1.set(Calendar.DAY_OF_MONTH, d1.getDay());
c2.set(Calendar.YEAR, d2.getYear());
c2.set(Calendar.MONTH, d2.getMonth());
c2.set(Calendar.DAY_OF_MONTH, d2.getDay());
return c1.getTime().compareTo(c2.getTime());
}
कृपया ध्यान दें कि, दिनांक वर्ग का वंचित कारण है क्योंकि यह अंतर्राष्ट्रीयकरण के लिए उत्तरदायी नहीं था। इसके बजाय कैलेंडर वर्ग का उपयोग किया जाता है!
getXxxतरीकों का उपयोग करें Date।
पहले यह जान लें कि यह ऑपरेशन समय क्षेत्र पर निर्भर करता है। इसलिए चुनें कि क्या आप इसे यूटीसी में करना चाहते हैं, कंप्यूटर के समय क्षेत्र में, अपने पसंदीदा समय क्षेत्र में या जहां। यदि आप अभी तक इस मामले में आश्वस्त नहीं हैं, तो इस उत्तर के निचले भाग में मेरा उदाहरण देखें।
चूँकि आपका प्रश्न इस बारे में बिल्कुल स्पष्ट नहीं है, इसलिए मैं यह मान रहा हूँ कि आपके पास एक ऐसा क्षेत्र है जिसमें एक क्षेत्र है जिसका समय और कार्यान्वयन में एक बिंदु है Comparable, और आप चाहते हैं कि आपकी वस्तुओं का प्राकृतिक क्रम तिथि तक हो, लेकिन समय नहीं उस क्षेत्र में। उदाहरण के लिए:
public class ArnesClass implements Comparable<ArnesClass> {
private static final ZoneId arnesTimeZone = ZoneId.systemDefault();
private Instant when;
@Override
public int compareTo(ArnesClass o) {
// question is what to put here
}
}
java.timeकक्षाएंमैं से अपने उदाहरण मैदान के प्रकार को बदलने की स्वतंत्रता ले लिया है Dateकरने के लिए Instant, जावा 8. में इसी वर्ग मैं के उपचार के लिए वापसी का वादा Dateनीचे। मैंने एक टाइम ज़ोन स्थिरांक भी जोड़ा है। आप इसे करने के लिए सेट कर सकते हैं ZoneOffset.UTCया ZoneId.of("Europe/Stockholm")या आप क्या लगता है उचित (एक करने के लिए इसे स्थापित करने ZoneOffsetका काम करता है क्योंकि ZoneOffsetका एक उपवर्ग हैZoneId )।
मैंने जावा 8 कक्षाओं का उपयोग करके समाधान दिखाने के लिए चुना है। आपने सबसे सरल तरीका पूछा, है ना? :-) यहां वह compareToविधि है जो आपने मांगी थी:
public int compareTo(ArnesClass o) {
LocalDate dateWithoutTime = when.atZone(arnesTimeZone).toLocalDate();
LocalDate otherDateWithoutTime = o.when.atZone(arnesTimeZone).toLocalDate();
return dateWithoutTime.compareTo(otherDateWithoutTime);
}
यदि आपको कभी भी समय की आवश्यकता नहीं है when, तो यह निश्चित रूप से आसान है whenएक घोषित करनाLocalDate और सभी रूपांतरणों को छोड़ना । फिर हमें अब समय क्षेत्र के बारे में चिंता करने की आवश्यकता नहीं है।
अब मान लीजिए कि किसी कारण से आप अपने whenक्षेत्र की घोषणा नहीं कर सकते हैं Instantया आप इसे पुराने जमाने का रखना चाहते हैं Date। यदि आप अभी भी जावा 8 का उपयोग कर सकते हैं Instant, तो इसे पहले रूपांतरित करें , फिर पहले की तरह करें:
LocalDate dateWithoutTime = when.toInstant().atZone(arnesTimeZone).toLocalDate();
इसी तरह के लिए o.when।
यदि आप जावा 8 का उपयोग नहीं कर सकते हैं, तो दो विकल्प हैं:
Calendarया SimpleDateFormat।Adamski का जवाब आपको दिखाता है कि कक्षा Dateका उपयोग करके समय भाग को कैसे पट्टी करना है Calendar। मेरा सुझाव है कि आप अपने इच्छित समय क्षेत्र के लिए उदाहरण getInstance(TimeZone)प्राप्त करने के लिए उपयोग करें Calendar। एक विकल्प के रूप में आप जोर्न के उत्तर के उत्तरार्ध से विचार का उपयोग कर सकते हैं ।
उपयोग करना SimpleDateFormatवास्तव में एक वस्तु के Calendarबाद से उपयोग करने का एक अप्रत्यक्ष तरीका है । हालाँकि, आपको सीधे उपयोग करने की तुलना में यह कम तकलीफदेह लग सकता है:SimpleDateFormatCalendarCalendar
private static final TimeZone arnesTimeZone = TimeZone.getTimeZone("Europe/Stockholm");
private static final DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
static {
formatter.setTimeZone(arnesTimeZone);
}
private Date when;
@Override
public int compareTo(ArnesClass o) {
return formatter.format(when).compareTo(formatter.format(o.when));
}
यह रॉब के जवाब से प्रेरित था ।
हमें एक विशिष्ट समय क्षेत्र क्यों चुनना है? यह कहें कि हम दो बार तुलना करना चाहते हैं कि UTC में 24 मार्च 0:00 (मध्यरात्रि) और 12:00 (दोपहर) हैं। यदि आप सीईटी (कहते हैं, यूरोप / पेरिस) में करते हैं, तो वे 24 मार्च को दोपहर 1 बजे और 1 बजे हैं, यानी एक ही तारीख। न्यूयॉर्क (ईस्टर्न डेलाइट टाइम) में, वे 23 मार्च को 20:00 और 24 मार्च को 8:00 बजे हैं, यही तारीख नहीं है। तो इससे फर्क पड़ता है कि आप किस टाइम जोन को चुनते हैं। अगर आप सिर्फ कंप्यूटर के डिफॉल्ट पर भरोसा करते हैं, तो आप आश्चर्य में पड़ सकते हैं जब कोई इस वैश्विक दुनिया में किसी दूसरे स्थान पर कंप्यूटर पर अपना कोड चलाने की कोशिश करता है।
थ्रीटेन बैकपोर्ट से लिंक, जावा 8 की तारीख और जावा 6 और 7 के लिए समय कक्षाएं: http://www.threeten.org/threetenbp/ ।
मेरा प्रस्ताव:
Calendar cal = Calendar.getInstance();
cal.set(1999,10,01); // nov 1st, 1999
cal.set(Calendar.AM_PM,Calendar.AM);
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
// date column in the Thought table is of type sql date
Thought thought = thoughtDao.getThought(date, language);
Assert.assertEquals(cal.getTime(), thought.getDate());
public static Date getZeroTimeDate(Date fecha) {
Date res = fecha;
Calendar calendar = Calendar.getInstance();
calendar.setTime( fecha );
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
res = calendar.getTime();
return res;
}
Date currentDate = getZeroTimeDate(new Date());// get current date
यह इस समस्या को हल करने का सबसे सरल तरीका है।
मैंने इसे टाइमस्टैम्प द्वारा तुलना करके हल किया:
Calendar last = Calendar.getInstance();
last.setTimeInMillis(firstTimeInMillis);
Calendar current = Calendar.getInstance();
if (last.get(Calendar.DAY_OF_MONTH) != current.get(Calendar.DAY_OF_MONTH)) {
//not the same day
}
मैं Joda Time का उपयोग करने से बचता हूं क्योंकि Android पर एक विशाल स्थान का उपयोग किया जाता है। आकर महत्त्व रखता है। ;)
जावा 8 और इंस्टेंट का उपयोग करते हुए एक और समाधान, ट्रंकटेटो विधि का उपयोग कर रहा है
निर्दिष्ट इकाई को काटे गए इस त्वरित की एक प्रति लौटाता है।
उदाहरण:
@Test
public void dateTruncate() throws InterruptedException {
Instant now = Instant.now();
Thread.sleep(1000*5);
Instant later = Instant.now();
assertThat(now, not(equalTo(later)));
assertThat(now.truncatedTo(ChronoUnit.DAYS), equalTo(later.truncatedTo(ChronoUnit.DAYS)));
}
// Create one day 00:00:00 calendar
int oneDayTimeStamp = 1523017440;
Calendar oneDayCal = Calendar.getInstance();
oneDayCal.setTimeInMillis(oneDayTimeStamp * 1000L);
oneDayCal.set(Calendar.HOUR_OF_DAY, 0);
oneDayCal.set(Calendar.MINUTE, 0);
oneDayCal.set(Calendar.SECOND, 0);
oneDayCal.set(Calendar.MILLISECOND, 0);
// Create current day 00:00:00 calendar
Calendar currentCal = Calendar.getInstance();
currentCal.set(Calendar.HOUR_OF_DAY, 0);
currentCal.set(Calendar.MINUTE, 0);
currentCal.set(Calendar.SECOND, 0);
currentCal.set(Calendar.MILLISECOND, 0);
if (oneDayCal.compareTo(currentCal) == 0) {
// Same day (excluding time)
}
इसी से मेरा काम बना है:
var Date1 = new Date(dateObject1.toDateString()); //this sets time to 00:00:00
var Date2 = new Date(dateObject2.toDateString());
//do a normal compare
if(Date1 > Date2){ //do something }