সময়ের অংশ ব্যতীত দুটি তারিখের তুলনা কীভাবে করা যায়?


202

আমি একটি তুলনামূলক পদ্ধতি চাই যা জাভা.ইউটি.এল তারিখের সময়ের অংশটিকে উপেক্ষা করে। আমার ধারণা এটি সমাধান করার জন্য বেশ কয়েকটি উপায় রয়েছে। সবচেয়ে সহজ উপায় কি?

উত্তর:


212

আপডেট: জোদা সময় সেই সময়ে দুর্দান্ত প্রস্তাব ছিল, 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

28
জোন যেভাবে বলেছেন "যোডা টাইম ব্যবহার করুন" জাভা.ইটিল.ডেট বা জাভা.ইটিল.ক্যালেন্ডার সম্পর্কে জিজ্ঞাসা করা প্রায় সমস্ত প্রশ্নের ভিত্তি যা আমি সর্বদা মনে করি যে প্রথমে ব্যবহারকারীর প্রশ্নের উপর ভিত্তি করে একটি সুনির্দিষ্ট উত্তর দেওয়া ভাল at অন্তত জাভা উপায়ে করা কত কঠিন হতে পারে তা দেখানোর জন্য। এবং এর পরে জোদা ব্যবহার করার পরামর্শ
দিচ্ছে

13
@ জুয়ানজে: এর জন্য একটি বেদনাদায়ক এপিআইতে সঠিকভাবে কীভাবে কিছু করা যায় তার ঠিক কাজ করা দরকার যা সংজ্ঞায়িতভাবে বেদনাদায়ক। আমি বরং সময়টি আরও বেশি উত্পাদনশীল করার জন্য ব্যয় করতাম :)
জন স্কিটি

1
@ মেট্রয়েডফ্যান ২০০২: স্থানীয় সময়সীমাটি ডেটমিডনাইটের চেয়ে ভাল বিকল্প, কারণ এটি আরও প্রকাশিত - এবং সমস্ত দিনের মধ্যরাত হয় না ...
জন স্কিটি

2
@ এডটারনি: অবশ্যই - ব্রাজিলে, যখন দিনের আলো সাশ্রয়ের কারণে ঘড়িগুলি এগিয়ে যায়, দিনের শুরুতেই ঘটে ... তাই একটি ঘড়ি পড়বে 23:59:58, 23:59:59, 01:00 : 00, 01:00:01 ইত্যাদি
জন স্কিটি


125

অ্যাপাচি কমন্স-ল্যাং প্রায় সর্বব্যাপী। তাহলে কি এই সম্পর্কে?

if (DateUtils.isSameDay(date1, date2)) {
    // it's same
} else if (date1.before(date2)) {
   // it's before
} else {
   // it's after
}

সংস্করণ ২.6-তে একটি কাটা কাটা কম্পেরটো
shonky লিনাক্স ব্যবহারকারী

2
দুর্ভাগ্যক্রমে নাল তারিখগুলি সহ্য করে না
পাভেল নিডোবা

বন্ধুরা, আজকাল আমাদের জাভা 8 স্ট্যাকওভারফ্লো.com
আন্দ্রে

আমি এইভাবে আগে ব্যবহারের পরামর্শ দিচ্ছি না কারণ যদি প্রথম বা দ্বিতীয় তারিখের অবজেক্টটি টাইমস্ট্যাম্প থেকে ডনক্যাসট করা হয় এবং মাইলসেকেন্ড থাকে, এবং অন্যটি একটি সাধারণ একটি ডেট অবজেক্ট যা আপনার সমস্যায় পড়বে কারণ, ডেটস্ট্যাম্প স্টোর থেকে তারিখটি আলাদা অংশে উভয় তারিখ সমান হলেও বস্তুর মিলসেকেন্ডগুলি পার্থক্য দেয়।
জিনি

দুর্ভাগ্যক্রমে, অ্যাপাচি এটি 1.3 বিলিয়নের বেশি অ্যান্ড্রয়েড ডিভাইসে নেই, এবং এটি কেবল একটি ব্যবহারের ক্ষেত্রে নির্ভর করতে একটি বিশাল গ্রন্থাগার। আমার আর কিছু লাগবে: /
মিলস্মোন্স

58

আপনি যদি সত্যিই 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);
  }
}

1
দ্বিতীয় পদ্ধতিতে আপনি আপনার কিছু উল্লেখ উল্লেখ করতে ভুলে গেছেন, ডি 1, ডি 2 থেকে সি 1, সি 2 তে।
স্টিভ্লো

1
এই কোডটি ঠিক করার পরে আপনার কোডটি ভালভাবে কাজ করে: আমি ব্যাপকভাবে ইউনিট এটি পরীক্ষা করেছি। আমি তারিখগুলি থেকে একটি ক্যালেন্ডার তৈরি করার পদক্ষেপটি যুক্ত করেছি এবং আমার সদ্য নির্মিত গিথুব প্রকল্পে org.obliquid.helpers তে আপনার কোড ব্যবহার করেছি , ধন্যবাদ।
স্টিভ্লো

কোনও বাহ্যিক গ্রন্থাগার ব্যবহার না করে মিষ্টি, দুর্দান্ত সমাধান।
4gus71n

1
এই সমস্ত পদ্ধতি অবমূল্যায়ন করা হয়। এর কি কোনও ধরণের প্রভাব থাকতে পারে?
প্রণব মহাজন

36

আমার পক্ষপাত ব্যবহার করতে হবে 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();
}

1
জোডা-টাইম ইয়ারমোনথডে লোকালডেটের পক্ষে অবচয় করা হয়েছে। এছাড়াও, দিবালোক সংরক্ষণের কারণে টাইম জোনের মধ্যরাত 00:00 না থাকলে ক্যালেন্ডারে কোডটিতে সমস্যা থাকবে।
জোদাস্টেফেন

1
এটি সময়ের 100% কাজ করে না। আমি এটি করেছি যেখানে একটি ব্যবহারের কেস ছিল এবং ক্যালেন্ডার.সেটটাইম () এখনও প্যারামিটারের তারিখ হিসাবে নির্ধারিত সময়ের সাথে সময়টি ফিরে আসত। ক্ষেত্রগুলি সাফ করার জন্য এবং কেবল বছর, মাস এবং দিন নির্ধারণ করা সেরা।
জোনাথন ড্রিপো

31

এই বিকল্প সম্পর্কে কোন মতামত?

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

1
আমি মনে করি না যে এটি কার্যকর হবে, এমনকি স্ট্রিংসে রূপান্তর করা ভাল ধারণা ছিল। ==অপারেটর অগত্যা ফেরত দেয় না trueসমতুল্য স্ট্রিংস (ব্যবহারের জন্য equals())। আপনি উল্লিখিত অন্যান্য তুলনা অপারেটরগুলি অবশ্যই ব্যবহার করতে পারবেন না।
হার্টো

1
আহ্ হ্যাঁ - আমার রুবি আমার জাভা নষ্ট করছে! <,> ইত্যাদির জন্য স্ট্রিংগুলি ইনটগুলিতে রূপান্তর করতে পারে
রবার্ট ব্রাউন

জোদা ব্যবহার করা সাউন্ড ওয়ে, তবে এটি মার্জিত!
আরে এভার্টসন

এটি সবার জন্য কাজ করবে না, তবে এটি খুব সাধারণ এবং হালকা ওজনের; অন্যান্য বিকল্পগুলি উপলব্ধ না হলে একটি ভাল বিকল্প।
জ্যাকব মার্বেল

খেজুর ক্রম পেতে, আপনি ব্যবহার করতে পারেন sdf.format(date1).compareTo(sdf.format(date2));
ওলে ভিভি

18

আপনি যদি কেবল দুটি তারিখের মাস, দিন এবং বছরের তুলনা করতে চান তবে নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

ধন্যবাদ রব


13

আমিও জোদা সময়কে পছন্দ করি তবে এখানে একটি বিকল্প রয়েছে:

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
ভাদজিম

@Vadzim এটা করুন < oneDay
ড্যানিয়েল সি। সোব্রাল

2
@ ভাদজিম, কেবল তারিখের তুলনায় 1 দিনের কম সময় আছে কিনা তা পরীক্ষা করে দেখায়। অগত্যা তারা একই দিনে আছে মানে না।
অরহন্ত

@ আরহান্ট, হ্যাঁ এটি যথেষ্ট হতে পারে যখন দ্বিতীয় তারিখ সর্বদা মধ্যরাত্রিযুক্ত থাকে।
ভাদজিম

12

TL; ড

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, এবং আরো


7

ইতিমধ্যে অ্যাপাচি কমন্স-ইউটিস উল্লেখ করা হয়েছে :

org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)

সময় ব্যতীত আপনাকে কেবল তারিখ সম্বলিত তারিখ অবজেক্ট দেয় এবং আপনি এটির সাথে তুলনা করতে পারেন Date.compareTo


6

আমি ভয় করি যে দুটি তারিখের তুলনা করার কোনও পদ্ধতি নেই যা "সহজ" বা "সাধারণ" বলা যেতে পারে।

যে কোনও ধরণের হ্রাস নির্ভুলতা (উদাহরণস্বরূপ কেবল তারিখের তুলনা) এর সাথে দু'বারের দৃষ্টান্ত তুলনা করার সময় আপনার কীভাবে সময় অঞ্চল তুলনা প্রভাবিত করে তা বিবেচনা করা উচিত।

যদি date1+2 টাইমজোন এবং occurreddate2 সংঘটিত ইভেন্টটি নির্দিষ্ট করে থাকে এবং EST তে ঘটেছিল এমন একটি ইভেন্ট নির্দিষ্ট করে দিচ্ছে, উদাহরণস্বরূপ, তুলনাটির প্রভাবগুলি সঠিকভাবে বোঝার জন্য আপনাকে অবশ্যই যত্ন নিতে হবে।

দুটি ইভেন্ট একই ক্যালেন্ডারের তারিখে স্ব স্ব সময়মণ্ডলে ঘটেছে কিনা তা খুঁজে বের করার আপনার উদ্দেশ্য? অথবা আপনার কী জানতে হবে যে দুটি তারিখ নির্দিষ্ট সময় অঞ্চলে একই ক্যালেন্ডারের তারিখে পড়েছে (উদাহরণস্বরূপ ইউটিসি বা আপনার স্থানীয় টিজেড)।

আপনি যখন তুলনা করার চেষ্টা করছেন এটি আসলে কী তা বুঝতে পেরে, এটি একটি উপযুক্ত সময় অঞ্চলে বছরের-মাসের তারিখ ট্রিপল পাওয়ার এবং তুলনাটি করার বিষয়টি মাত্র।

জোদা সময় প্রকৃত তুলনা অপারেশনটিকে আরও পরিষ্কার দেখায়, তবে তুলনার শব্দার্থকতা এখনও এমন কিছু যা আপনার নিজের খুঁজে বের করতে হবে।


6

আপনি যদি জাভা 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);

5

আপনি যদি সময় ছাড়া কেবল মাত্র দুটি তারিখের তুলনা করতে চান তবে নিম্নলিখিত কোডগুলি আপনাকে সহায়তা করতে পারে:

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
}

রব এর উত্তর হিসাবে এটি একই । আমি মনে করি জর্নের সমাধানটি আরও ভাল কারণ এটি স্ট্রিংগুলিতে রাউন্ড ট্রিপ জড়িত না এবং একই জিনিসটি সম্পাদন করা উচিত।
রুপ

4

এখানে এই ব্লগ থেকে একটি সমাধান পাওয়া যাবে: 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.");

অর্থাত্ আপনি দেখতে পাচ্ছেন যে এক দিনের দৈর্ঘ্যের চেয়ে মিলি সেকেন্ডে সময়ের পার্থক্য কম।


4
এই নমুনাটি খতিয়ে দেখবে যে দুটি তারিখ একে অপরের 24 ঘন্টার মধ্যে রয়েছে তবে অগত্যা তারা উভয় একই তারিখে থাকলে, অর্থাত্ মধ্যরাত বিস্তৃত হওয়া সম্ভব। পরিবর্তে মিলিসের উভয় সেটকে মিলিলিস_একটিডিএ দ্বারা বিভক্ত করা এবং ফলাফলের তুলনা করা ভাল তবে এটি কেবল স্থানীয় সময় নয় ইউটিসি-র জন্য সঠিক হবে।
রুপ

4

`

SimpleDateFormat sdf= new SimpleDateFormat("MM/dd/yyyy")

   Date date1=sdf.parse("03/25/2015");



  Date currentDate= sdf.parse(sdf.format(new Date()));

   return date1.compareTo(currentDate);

`


3

আমি জানি না এটি নতুন চিন্তা বা অন্যথায়, তবে আমি আপনাকে আমার মতো করে দেখিয়েছি

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);

3

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
    }
}

এটি ভুল কারণ বিভিন্ন বছরের সাথে তারিখগুলিতে বছরের একই দিন থাকতে পারে উদাহরণস্বরূপ 2015-01-01 এবং 2016-01-01।
নেলসন

আপনার মন্তব্যের জন্য @ নেলসনলদোরো ধন্যবাদ, বছরের জন্য একটি চেক যোগ করতে ভুলে গেছি, এখন এটি ঠিক হওয়া উচিত।
সাইমন কে। গার্জেস

2

জাভা 8-এ আপনি লোকালডেট ব্যবহার করতে পারেন যা জোদা টাইমের মতোই অনুরূপ।


2
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();
}

এটি আপনাকে সময় বিবেচনা না করে তারিখগুলি তুলনা করতে সহায়তা করবে।


1

সিম্পলডেটফরম্যাটটির 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));  

    }


1

এখানে উত্তর এবং আমার পরামর্শদাতা গাইডেন্সির উপর ভিত্তি করে অন্য একটি সহজ তুলনা পদ্ধতি

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());
}

অনুগ্রহ করে লক্ষ্য করুন যে, তারিখ শ্রেণি হ্রাস করা হয়েছে কারণ এটি আন্তর্জাতিকীকরণের পক্ষে উপযুক্ত ছিল না। পরিবর্তে ক্যালেন্ডার ক্লাস ব্যবহার করা হয়!


এটি সময়ের 100% কাজ করে না। আমি এটি করেছি যেখানে একটি ব্যবহারের কেস ছিল এবং ক্যালেন্ডার.সেটটাইম () এখনও প্যারামিটারের তারিখ হিসাবে নির্ধারিত সময়ের সাথে সময়টি ফিরে আসত। ক্ষেত্রগুলি সাফ করার জন্য এবং কেবল বছর, মাস এবং দিন নির্ধারণ করা সেরা।
জোনাথন ড্রিপো

@ জোনাথনড্রেপাউ, আমার কাছে মনে হচ্ছে আপনি কোনও সুস্পষ্ট সময় অঞ্চল বেছে না নেওয়ার পরিণতিতে চলে এসেছেন। অবজ্ঞাত getXxxপদ্ধতিগুলি ব্যবহারের চেয়ে অবশ্যই সময় অঞ্চলকে আরও সুস্পষ্ট করে তুলুন Date
ওলে ভিভি

1

প্রথমে সচেতন থাকুন যে এই অপারেশনটি সময় অঞ্চলের উপর নির্ভর করে। সুতরাং আপনি এটি ইউটিসি, কম্পিউটারের টাইম জোনে, আপনার নিজের পছন্দসই টাইম জোনে বা কোথায় করতে চান তা চয়ন করুন। আপনি যদি এখনও এটির বিষয়ে নিশ্চিত হন না তবে এই উত্তরটির নীচে আমার উদাহরণটি দেখুন।

যেহেতু আপনার প্রশ্নটি এ সম্পর্কে পুরোপুরি স্পষ্ট নয়, আমি ধরে নিচ্ছি যে আপনার একটি শ্রেণি রয়েছে যা একটি ক্ষেত্র রয়েছে যা একটি সময়কে নির্দেশ করে এবং বাস্তবায়ন করে 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
    }

}

জাভা 8 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 নেই?

আপনি যদি জাভা 8 ব্যবহার করতে না পারেন তবে দুটি বিকল্প রয়েছে:

  1. পুরানো ক্লাসগুলির একটি ব্যবহার করে এটি সমাধান করুন, হয় Calendarবা হয় SimpleDateFormat
  2. জাভা date ও 7 তারিখের এবং সময় শ্রেণীর জাভাটির ব্যাকপোর্ট ব্যবহার করুন, তারপরে উপরের মতটি করুন। আমি নীচে একটি লিঙ্ক অন্তর্ভুক্ত। জোডটাইম ব্যবহার করবেন না। জোদাটাইম সম্ভবত প্রস্তাবনা উত্তর ছিল যখন এটি লেখা ছিল সম্ভবত একটি ভাল পরামর্শ; তবে জোডাটাইম এখন রক্ষণাবেক্ষণের মোডে রয়েছে, তাই থ্রিটেন ব্যাকপোর্টটি আরও ভাল এবং আরও ভবিষ্যতের প্রতিরোধী বিকল্প।

পুরানো ধাঁচের উপায়

অ্যাডামস্কির উত্তর আপনাকে দেখায় যে কীভাবে ক্লাসটি 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/


0

আমার প্রস্তাব:

    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());


0
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   

এই সমস্যাটি সমাধানের এটি সহজতম উপায়।


0

টাইমস্ট্যাম্পের সাথে তুলনা করে আমি এটি সমাধান করেছি:

    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
    }

আমি জোদা সময় ব্যবহার করা এড়াচ্ছি কারণ অ্যান্ড্রয়েডে একটি বিশাল স্থান ব্যবহার করে। আকার বিষয়ে. ;)


0

জাভা 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)));
}

0
// 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)
}

ধন্যবাদ! ইতিমধ্যে একই পদ্ধতির সাথে আরও কয়েকটি উত্তর রয়েছে - যদিও আমি এখন দেখতে পাচ্ছি আপনি ক্যালেন্ডার অবজেক্টগুলি সরাসরি তুলনা করছেন যেখানে তারা মূলত গেটটাইম () এর তুলনা করে।
রূপ

-2

এটিই আমার পক্ষে কাজ করেছে:

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 }

2
আপনার "স্বাভাবিক" তুলনা জাভাতেও সংকলন করতে পারে না। যদি এটি হয় তবে এটি বস্তুর রেফারেন্সগুলি তুলনা করবে, তবে এটি অনুমোদিত নয়।
স্টিভ্লো

আমি মার্কডাউন যোগ করার জন্য সম্পাদনা করেছি, তবে স্টিভ্লো ঠিক আছে। "কোডটি আপনার পক্ষে কীভাবে কাজ করেছিল" কীভাবে আমার কোনও ধারণা নেই।
পোপস

এটি সম্ভবত জেএস।
আন্দ্রে লুইজ

-2

কীভাবে DateUtil.daysBetween()। এটি জাভা এবং এটি একটি নম্বর দেয় (দিনের মধ্যে পার্থক্য)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.