আমি একটি তুলনামূলক পদ্ধতি চাই যা জাভা.ইউটি.এল তারিখের সময়ের অংশটিকে উপেক্ষা করে। আমার ধারণা এটি সমাধান করার জন্য বেশ কয়েকটি উপায় রয়েছে। সবচেয়ে সহজ উপায় কি?
আমি একটি তুলনামূলক পদ্ধতি চাই যা জাভা.ইউটি.এল তারিখের সময়ের অংশটিকে উপেক্ষা করে। আমার ধারণা এটি সমাধান করার জন্য বেশ কয়েকটি উপায় রয়েছে। সবচেয়ে সহজ উপায় কি?
উত্তর:
আপডেট: জোদা সময় সেই সময়ে দুর্দান্ত প্রস্তাব ছিল, 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 সময়" প্রায় সমস্ত তাই প্রশ্ন যা সম্পর্কে জিজ্ঞাসা ভিত্তিতে java.util.Dateবা java.util.Calendar। এটা একটা পুঙ্খানুপুঙ্খভাবে উচ্চতর এপিআই আছে। আপনি করছেন থাকেন কিছু সঙ্গে খেজুর / বার উল্লেখযোগ্য, আপনি কি সত্যিই এটি ব্যবহার করা উচিত যদি তোমরা সম্ভবত পারেন।)
আপনি যদি বিল্ট ইন এপিআই ব্যবহার করতে বাধ্য হন Calendarতবে আপনার উপযুক্ত তারিখ এবং উপযুক্ত সময় অঞ্চলটি ব্যবহার করে একটি উদাহরণ তৈরি করা উচিত । তারপরে আপনি প্রতিটি ক্যালেন্ডারে প্রতিটি ক্ষেত্রকে ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ড থেকে 0 এ সেট করতে এবং ফলাফলের সময়গুলি তুলনা করতে পারেন। অবশ্যই জোদা সমাধানের সাথে তুলনায় আইকি :)
সময় অঞ্চল অংশ গুরুত্বপূর্ণ: java.util.Dateহয় সবসময় ইউটিসি উপর ভিত্তি করে। বেশিরভাগ ক্ষেত্রে যেখানে আমি কোনও তারিখে আগ্রহী, সেখানে নির্দিষ্ট সময় অঞ্চলে একটি তারিখ ছিল । এটি নিজে থেকে আপনাকে Calendarবা জোদা সময়কে ব্যবহার করতে বাধ্য করবে (যদি আপনি সময় অঞ্চলটির জন্য নিজেকে হিসাব করতে না চান তবে আমি প্রস্তাব দিই না।)
অ্যান্ড্রয়েড বিকাশকারীদের জন্য দ্রুত রেফারেন্স
//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));।
আমিও জোদা সময়কে পছন্দ করি তবে এখানে একটি বিকল্প রয়েছে:
long oneDay = 24 * 60 * 60 * 1000
long d1 = first.getTime() / oneDay
long d2 = second.getTime() / oneDay
d1 == d2
সম্পাদনা
আপনার ইউটিসি ব্যতীত অন্য একটি নির্দিষ্ট সময় অঞ্চলের জন্য তারিখের তুলনা করার প্রয়োজনে আমি ইউটিসি কে নীচে রেখেছি। যদিও আপনার যদি এমন কোনও প্রয়োজন হয় তবে আমি সত্যিই জোড়ার দিকে যাওয়ার পরামর্শ দিই।
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 এখন, জাভা.টাইম ক্লাসগুলি দ্বারা বর্ধিত করা ।
A java.util.Dateইউটিসিতে সময়রেখার একটি মুহূর্ত উপস্থাপন করে। জাভা.টাইমের সমতুল্য Instant। উত্তরাধিকার শ্রেণিতে যুক্ত হওয়া নতুন পদ্ধতি ব্যবহার করে আপনি রূপান্তর করতে পারেন।
Instant instant1 = myJavaUtilDate1.toInstant();
Instant instant2 = myJavaUtilDate2.toInstant();
আপনি তারিখ দ্বারা তুলনা করতে চান। সময় নির্ধারণের জন্য একটি সময় অঞ্চল গুরুত্বপূর্ণ। যে কোনও মুহুর্তের জন্য, তারিখটি অঞ্চল অনুসারে বিশ্ব জুড়ে পরিবর্তিত হয়। উদাহরণস্বরূপ, প্যারিসে মধ্যরাতের কয়েক মিনিটের পরে ফ্রান্স একটি নতুন দিন এবং মন্ট্রিয়াল কোয়েবেকে "গতকাল" এখনও রয়েছে ।
একটি নির্দিষ্ট করুন সঠিক সময় অঞ্চল নাম এর বিন্যাসে continent/regionযেমন America/Montreal, Africa/Casablancaঅথবা Pacific/Auckland। কখনও যেমন 3-4 চিঠি সংক্ষেপ ব্যবহার ESTবা ISTহিসাবে তারা না সত্য সময় অঞ্চল, না মান, এবং এমনকি অনন্য নয় (!)।
ZoneId z = ZoneId.of( "America/Montreal" );
প্রয়োগ ZoneIdকরার জন্য Instantএকটি পেতে ZonedDateTime।
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 [আমেরিকা / মন্ট্রিল]
স্থানীয় তারিখ 1: 2017-03-25 | স্থানীয় তারিখ 2: 2017-03-24
একই তারিখ: মিথ্যা
Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat
Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , এর মাইগ্রেশন উপদেশ java.time ক্লাস।
আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310 ।
জাভা.টাইম ক্লাস কোথায় পাবেন?
ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো ।
ইতিমধ্যে অ্যাপাচি কমন্স-ইউটিস উল্লেখ করা হয়েছে :
org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)
সময় ব্যতীত আপনাকে কেবল তারিখ সম্বলিত তারিখ অবজেক্ট দেয় এবং আপনি এটির সাথে তুলনা করতে পারেন Date.compareTo
আমি ভয় করি যে দুটি তারিখের তুলনা করার কোনও পদ্ধতি নেই যা "সহজ" বা "সাধারণ" বলা যেতে পারে।
যে কোনও ধরণের হ্রাস নির্ভুলতা (উদাহরণস্বরূপ কেবল তারিখের তুলনা) এর সাথে দু'বারের দৃষ্টান্ত তুলনা করার সময় আপনার কীভাবে সময় অঞ্চল তুলনা প্রভাবিত করে তা বিবেচনা করা উচিত।
যদি date1+2 টাইমজোন এবং occurreddate2 সংঘটিত ইভেন্টটি নির্দিষ্ট করে থাকে এবং EST তে ঘটেছিল এমন একটি ইভেন্ট নির্দিষ্ট করে দিচ্ছে, উদাহরণস্বরূপ, তুলনাটির প্রভাবগুলি সঠিকভাবে বোঝার জন্য আপনাকে অবশ্যই যত্ন নিতে হবে।
দুটি ইভেন্ট একই ক্যালেন্ডারের তারিখে স্ব স্ব সময়মণ্ডলে ঘটেছে কিনা তা খুঁজে বের করার আপনার উদ্দেশ্য? অথবা আপনার কী জানতে হবে যে দুটি তারিখ নির্দিষ্ট সময় অঞ্চলে একই ক্যালেন্ডারের তারিখে পড়েছে (উদাহরণস্বরূপ ইউটিসি বা আপনার স্থানীয় টিজেড)।
আপনি যখন তুলনা করার চেষ্টা করছেন এটি আসলে কী তা বুঝতে পেরে, এটি একটি উপযুক্ত সময় অঞ্চলে বছরের-মাসের তারিখ ট্রিপল পাওয়ার এবং তুলনাটি করার বিষয়টি মাত্র।
জোদা সময় প্রকৃত তুলনা অপারেশনটিকে আরও পরিষ্কার দেখায়, তবে তুলনার শব্দার্থকতা এখনও এমন কিছু যা আপনার নিজের খুঁজে বের করতে হবে।
আপনি যদি জাভা 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-dates.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();
}
এটি আপনাকে সময় বিবেচনা না করে তারিখগুলি তুলনা করতে সহায়তা করবে।
সিম্পলডেটফরম্যাটটির 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());
}
সম্পাদনা : @ জোনাথন ড্রিপোর মতে, উপরের কোডটি কিছু ক্ষেত্রে ব্যর্থ হয়েছে (আমি এই মামলাগুলি দেখতে চাই, দয়া করে) এবং তিনি যেমনটি বুঝতে পেরেছিলেন তেমন পরামর্শ দিয়েছেন:
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. সংশ্লিষ্ট ক্লাস I চিকিত্সার ফিরে যাওয়ার অঙ্গীকার 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।অ্যাডামস্কির উত্তর আপনাকে দেখায় যে কীভাবে ক্লাসটি Dateব্যবহার করে সময়ের অংশটি কেটে ফেলা যায় Calendar। আমি আপনাকে চাইলে getInstance(TimeZone)যে Calendarঅঞ্চলটি আপনি চান তার জন্য উদাহরণটি ব্যবহার করতে পরামর্শ দিন । বিকল্প হিসাবে আপনি জর্নের উত্তরের দ্বিতীয়ার্ধ থেকে ধারণাটি ব্যবহার করতে পারেন ।
ব্যবহার SimpleDateFormatহ'ল ব্যবহারের সত্যিকারের একটি পরোক্ষ উপায়, Calendarযেহেতু SimpleDateFormatকোনও Calendarবস্তু থাকে। তবে আপনি এটি Calendarসরাসরি ব্যবহারের চেয়ে কম ঝামেলাজনক দেখতে পাবেন :
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));
}
এটি রবের উত্তর দ্বারা অনুপ্রাণিত হয়েছিল ।
কেন আমাদের একটি নির্দিষ্ট সময় অঞ্চল বেছে নিতে হবে? বলুন যে আমরা দুটিবার তুলনা করতে চাই যে ইউটিসি তে মার্চ 24 0:00 (মধ্যরাত) এবং 12:00 (দুপুর) হয়। আপনি যদি সিইটি (বলুন, ইউরোপ / প্যারিস) তে এটি করেন তবে তারা ২৪ শে মার্চ, অর্থাৎ একই তারিখের সকাল 1 টা এবং দুপুর 1 টা। নিউ ইয়র্কে (পূর্ব দিনের আলো সময়), তারা 23 শে মার্চ 20:00 এবং 24 মার্চ 8:00, যে একই তারিখ নয়। সুতরাং আপনি কোন সময় অঞ্চল বেছে নেবেন তা একটি পার্থক্য করে। আপনি যদি কেবলমাত্র কম্পিউটারের ডিফল্টের উপর নির্ভর করেন তবে আপনি যখন বিশ্বায়নের এই পৃথিবীতে অন্য কোনও জায়গায় কম্পিউটারে আপনার কোড চালানোর চেষ্টা করেন তখন আপনি অবাক হয়ে যেতে পারেন।
জাভা and এবং to এর সাথে জাভা 8 তারিখ এবং সময় শ্রেণীর ব্যাকপোর্ট, থ্রিটেন ব্যাকপোর্টের লিঙ্ক: 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());
অ্যাপাচি কমন্স ব্যবহার করে আপনি করতে পারেন:
import org.apache.commons.lang3.time.DateUtils
DateUtils.truncatedEquals(first, second, Calendar.DAY_OF_MONTH)
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
}
আমি জোদা সময় ব্যবহার করা এড়াচ্ছি কারণ অ্যান্ড্রয়েডে একটি বিশাল স্থান ব্যবহার করে। আকার বিষয়ে. ;)
জাভা 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 }