অ্যান্ড্রয়েডে তারিখগুলির তুলনা করার সর্বোত্তম উপায়


102

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

PS আমি জাভাতে ডেট স্টাফ করা সত্যিই ঘৃণা করি। একই জিনিসটি করার অনেকগুলি উপায় রয়েছে, যা সত্য আপনি নিশ্চিত নন যে কোনটি সঠিক, তাই এখানে আমার প্রশ্ন।

String valid_until = "1/1/1990";

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated       

Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);

Calendar currentDate = Calendar.getInstance();

if (currentDate.after(validDate)) {
    catalog_outdated = 1;
}

4
2018 সালে সবচেয়ে ভালো উপায় সঙ্গে যুক্ত নয় Calendar, SimpleDateFormat, Dateবা অন্যান্য দীর্ঘ সেকেলে জাভা তারিখ এবং সময় শ্রেণীর কোন। পরিবর্তে ব্যবহার করুন java.time, আধুনিক জাভা তারিখ এবং সময় এপিআই । হ্যাঁ, আপনি এটি অ্যান্ড্রয়েডে ব্যবহার করতে পারেন। পুরানো অ্যান্ড্রয়েডের জন্য অ্যান্ড্রয়েড প্রকল্পে থ্রিটেনএবিপি কীভাবে ব্যবহার করবেন তা দেখুন ।
ওলে ভিভি

উত্তর:


219

আপনার কোড কমানো যেতে পারে

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

অথবা

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}

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

গ্রহণ করার আগে কেবল তা নিশ্চিত করতে চেয়েছি। ধন্যবাদ। এটি নিখুঁতভাবে কাজ করেছে এবং সংক্ষিপ্ত এবং চেয়েছিল হিসাবে সহজ।
নুনোস

16
আমি মনে করি, এখানে dd / mm / yyyy এর পরিবর্তে dd / MM / yyyy ফর্ম্যাটটি ব্যবহার করা উচিত, কারণ "মি" এর অর্থ মিনিট, এবং "এম" মানে মাস।
ডেমউইস

তুলনামূলক পদ্ধতি () পদ্ধতি ব্যবহার করা কি ভাল হবে না?
ক্লাস অ্যান্ড্রয়েড

25

আপনি তুলনা করুন () ব্যবহার করতে পারেন

অন্যান্য বস্তুর তুলনায় বর্তমান বস্তু কম হলে তুলনামূলক পদ্ধতিতে negativeণাত্মক সংখ্যা অবশ্যই আনতে হবে, বর্তমান বস্তু অন্য বস্তুর চেয়ে বড় হলে ধনাত্মক সংখ্যা এবং উভয় বস্তু একে অপরের সমান হলে শূন্য হবে।

// Get Current Date Time
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm aa");
String getCurrentDateTime = sdf.format(c.getTime());
String getMyTime="05/19/2016 09:45 PM ";
Log.d("getCurrentDateTime",getCurrentDateTime); 
// getCurrentDateTime: 05/23/2016 18:49 PM

if (getCurrentDateTime.compareTo(getMyTime) < 0)
{

}
else
{
 Log.d("Return","getMyTime older than getCurrentDateTime "); 
}

1
অবগতির জন্য, যেমন বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time ক্লাস। জাভা.টাইম কার্যকারিতা বেশিরভাগ থ্রিটেন-ব্যাকপোর্ট প্রকল্পে জাভা 6 এবং জাভা 7 -এ ব্যাকপোর্ট করা হয়থ্রিটেনএবপি-তে পূর্ববর্তী অ্যান্ড্রয়েড (<26) এর জন্য আরও অভিযোজিত । দেখুন ThreeTenABP কীভাবে ব্যবহার করতে হয় ...
বাসিল বাউরক

10

আপনি সরাসরি একটি Calendarথেকে একটি তৈরি করতে পারেন Date:

Calendar validDate = new GregorianCalendar();
validDate.setTime(strDate);
if (Calendar.getInstance().after(validDate)) {
    catalog_outdated = 1;
}

10

নোট করুন যে কোডটি কাজ করার আগে ডান বিন্যাস ("dd / MM / yyyy")। "মিমি" মানে মিনিটস!

String valid_until = "01/07/2013";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = null;
try {
    strDate = sdf.parse(valid_until);
} catch (ParseException e) {
    e.printStackTrace();
}
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

7
Calendar toDayCalendar = Calendar.getInstance();
Date date1 = toDayCalendar.getTime();


Calendar tomorrowCalendar = Calendar.getInstance();
tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1);
Date date2 = tomorrowCalendar.getTime();

// date1 is a present date and date2 is tomorrow date

if ( date1.compareTo(date2) < 0 ) {

  //  0 comes when two date are same,
  //  1 comes when date1 is higher then date2
  // -1 comes when date1 is lower then date2

 }

অবগতির জন্য, যেমন বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time ক্লাস। জাভা.টাইম কার্যকারিতা বেশিরভাগ থ্রিটেন-ব্যাকপোর্ট প্রকল্পে জাভা 6 এবং জাভা 7 -এ ব্যাকপোর্ট করা হয়থ্রিটেনএবপি-তে পূর্ববর্তী অ্যান্ড্রয়েড (<26) এর জন্য আরও অভিযোজিত । দেখুন ThreeTenABP কীভাবে ব্যবহার করতে হয় ...
বেসিল Bourque

6
String date = "03/26/2012 11:00:00";
    String dateafter = "03/26/2012 11:59:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "MM/dd/yyyy hh:mm:ss");
    Date convertedDate = new Date();
    Date convertedDate2 = new Date();
    try {
        convertedDate = dateFormat.parse(date);
        convertedDate2 = dateFormat.parse(dateafter);
        if (convertedDate2.after(convertedDate)) {
            txtView.setText("true");
        } else {
            txtView.setText("false");
        }
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

এটি সত্য ফিরে আসে .. এবং আপনি তারিখ.পূর্বে এবং তারিখ.সকালীন সহায়তার সাথে আগে এবং সমানও পরীক্ষা করতে পারেন ..


3
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault());
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

Date date1 = dateFormat.parse("2013-01-01");
Date date2 = dateFormat.parse("2013-01-02");

calendar1.setTime(date1);
calendar2.setTime(date2);

System.out.println("Compare Result : " + calendar2.compareTo(calendar1));
System.out.println("Compare Result : " + calendar1.compareTo(calendar2));

এই ক্যালেন্ডার দ্বারা উপস্থাপিত সময়ের সাথে প্রদত্ত ক্যালেন্ডারের প্রতিনিধিত্বের সাথে তুলনা করে।

দুটি ক্যালেন্ডারের সময় সমান হলে 0 প্রদান করে, -১ এই ক্যালেন্ডারের সময় অন্যটির আগে থাকলে, 1 যদি এই ক্যালেন্ডারের সময় অন্য একের পরে হয়।


1
ধন্যবাদ .. এটা আমার সাহায্য।
pRaNaY 2'16

2

তারিখটিকে ক্যালেন্ডারে রূপান্তর করুন এবং সেখানে আপনার গণনা করুন। :)

Calendar cal = Calendar.getInstance();
cal.setTime(date);

int year = cal.get(Calendar.YEAR);
int month = cal.geT(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH); //same as cal.get(Calendar.DATE)

বা:

SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}

2

আধুনিক উত্তরের জন্য সময়।

java.Time এবং থ্রিটেনএবিপি

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    String validUntil = "1/1/1990";
    LocalDate validDate = LocalDate.parse(validUntil, dateFormatter);
    LocalDate currentDate = LocalDate.now(ZoneId.of("Pacific/Efate"));
    if (currentDate.isAfter(validDate)) {
        System.out.println("Catalog is outdated");
    }

আমি এখনই এই কোডটি চালিয়েছিলে আউটপুটটি ছিল:

ক্যাটালগ পুরানো

যেহেতু এটি সর্বকালের জোনে কখনই একই তারিখ নয়, তাই স্পষ্ট সময় অঞ্চল দিন LocalDate.now। আপনি যদি চান যে ক্যাটালগটি সমস্ত সময় জোনে একই সময়ে সমাপ্ত হয়, আপনি ZoneOffset.UTCযতক্ষণ না আপনি ব্যবহারকারীদের ইউটিসি ব্যবহার করছেন তা অবধি জানিয়ে দিতে পারেন ।

আমি জাভা.টাইম, আধুনিক জাভা তারিখ এবং সময় এপিআই ব্যবহার করছি। তারিখ-সময় শ্রেণীর ক্ষেত্রে আপনাকে ব্যবহৃত, Calendar, SimpleDateFormatএবং Date, সমস্ত দুর্বল ডিজাইন করা হয় এবং ভাগ্যক্রমে দীর্ঘ পুরানো। নাম সত্ত্বেও Dateকোনও একটি তারিখের প্রতিনিধিত্ব করে না, তবে সময়মতো একটি পয়েন্ট। এই একটা পরিনাম হল: যদিও আজ, 15 ই ফেব্রুয়ারি, 2019 একটি নতুন তৈরি করা Dateবস্তু আগে থেকেই পরে (তাই না সমান) একটি Dateপার্স থেকে অবজেক্ট 15/02/2019। এটি কিছু বিভ্রান্ত। এর বিপরীতে আধুনিকটি LocalDateদিনের সময় ব্যতীত (এবং সময় অঞ্চল ছাড়াই) একটি তারিখ, সুতরাং LocalDateআজকের তারিখের প্রতিনিধিত্বকারী দু'জন সর্বদা সমান হবে।

প্রশ্ন: আমি অ্যান্ড্রয়েডে জাভা.টাইম ব্যবহার করতে পারি?

হ্যাঁ, জাভা.টাইম পুরানো এবং আরও নতুন অ্যান্ড্রয়েড ডিভাইসে দুর্দান্তভাবে কাজ করে। এটির জন্য কমপক্ষে জাভা 6 প্রয়োজন

  • জাভা 8 এবং তারপরে এবং আরও নতুন অ্যান্ড্রয়েড ডিভাইসগুলিতে (এপিআই স্তর 26 থেকে) আধুনিক এপিআই বিল্ট ইন হয়।
  • জাভা 6 এবং 7-এ থ্রিটেন ব্যাকপোর্ট, আধুনিক ক্লাসগুলির ব্যাকপোর্ট (জেএসআর 310 এর জন্য থ্রিডেন; নীচে লিঙ্কগুলি দেখুন) পান।
  • (পুরানো) অ্যান্ড্রয়েড থ্রিটেন ব্যাকপোর্টের অ্যান্ড্রয়েড সংস্করণ ব্যবহার করে। একে থ্রিটেনএবিপি বলে। এবং org.threeten.bpসাব-প্যাকেজগুলি সহ আপনি তারিখ এবং সময় ক্লাসগুলি আমদানি করেছেন তা নিশ্চিত করুন ।

লিংক


1

আপনি এটি চেষ্টা করতে পারে

Calendar today = Calendar.getInstance (); 
today.add(Calendar.DAY_OF_YEAR, 0); 
today.set(Calendar.HOUR_OF_DAY, hrs); 
today.set(Calendar.MINUTE, mins ); 
today.set(Calendar.SECOND, 0); 

এবং আপনি today.getTime()মান পুনরুদ্ধার এবং তুলনা করতে ব্যবহার করতে পারেন ।


1

কখনও কখনও আমাদের সাথে খেজুর সহ একটি তালিকা করা প্রয়োজন

আজ ঘন্টা সহ

গতকাল সাথে গতকাল

23/06/2017 এর সাথে অন্যান্য দিন

এটি তৈরি করতে আমাদের বর্তমান সময়ের সাথে আমাদের উপাত্তের সাথে তুলনা করতে হবে।

Public class DateUtil {

    Public static int getDateDayOfMonth (Date date) {
        Calendar calendar = Calendar.getInstance ();
        Calendar.setTime (date);
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static int getCurrentDayOfMonth () {
        Calendar calendar = Calendar.getInstance ();
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static String convertMillisSecondsToHourString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("HH: mm");
        Return formatter.format (date);
    }

    Public static String convertMillisSecondsToDateString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("dd / MM / yyyy");
        Return formatter.format (date);
    }

    Public static long convertToMillisSecond (Date date) {
        Return date.getTime ();
    }

    Public static String compare (String stringData, String yesterday) {

        String result = "";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss");
        Date date = null;

        Try {
            Date = simpleDateFormat.parse (stringData);
        } Catch (ParseException e) {
            E.printStackTrace ();
        }

        Long millisSecond = convertToMillisSecond (date);
        Long currencyMillisSecond = System.currentTimeMillis ();

        If (currencyMillisSecond> millisSecond) {
            Long diff = currencyMillisSecond - millisSecond;
            Long day = 86400000L;

            If (diff <day && getCurrentDayOfMonth () == getDateDayOfMonth (date)) {
                Result = convertMillisSecondsToHourString (millisSecond);

            } Else if (diff <(day * 2) && getCurrentDayOfMonth () -1 == getDateDayOfMonth (date)) {
                Result = yesterday;
            } Else {
                Result = convertMillisSecondsToDateString (millisSecond);
            }
        }

        Return result;
    }
}

এছাড়াও আপনি গিটহাব এবং এই পোস্টে এই উদাহরণটি পরীক্ষা করতে পারেন ।


1

আপডেট করুন: Joda-টাইম গ্রন্থাগার রক্ষণাবেক্ষণ-মোড মধ্যে এখন হয়, এবং মাইগ্রেট পরামর্শ দেওয়া হচ্ছে java.time ফ্রেমওয়ার্ক এটি সফল। ওলে ভিভি দ্বারা উত্তর দেখুন ।


Joda-টাইম

Java.util. তারিখ এবং .ক্যালেন্ডার ক্লাসগুলি কুখ্যাত সমস্যাযুক্ত। এগুলি এড়িয়ে চলুন। জাভা 8 -এ জোডা-টাইম বা নতুন java.Time প্যাকেজটি ব্যবহার করুন ।

LOCALDATE

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

সময় অঞ্চল

বর্তমান তারিখ প্রাপ্তি সময় অঞ্চলের উপর নির্ভর করে। মন্ট্রিয়ালের আগে প্যারিসে একটি নতুন তারিখ গড়িয়েছে। জেভিএমের ডিফল্টর উপর নির্ভর করে কাঙ্ক্ষিত সময় অঞ্চল নির্দিষ্ট করুন ify

জোদা-সময় উদাহরণস্বরূপ 2.3।

DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "1/1/1990" );
boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );


0
SimpleDateFormat sdf=new SimpleDateFormat("d/MM/yyyy");
Date date=null;
Date date1=null;
try {
       date=sdf.parse(startDate);
       date1=sdf.parse(endDate);
    }  catch (ParseException e) {
              e.printStackTrace();
    }
if (date1.after(date) && date1.equals(date)) {
//..do your work..//
}

0

কোটলিন অপারেটরদের ওভারলোডিং সমর্থন করে

কোটলিনে আপনি তুলনা অপারেটরগুলির সাথে খেজুর সহজে তুলনা করতে পারেন। কারণ কোটলিন ইতিমধ্যে অপারেটরদের ওভারলোডিং সমর্থন করে। সুতরাং তারিখের বিষয়গুলি তুলনা করতে:

firstDate: Date = // your first date
secondDate: Date = // your second date

if(firstDate < secondDate){
// fist date is before second date
}

এবং আপনি যদি ক্যালেন্ডার অবজেক্ট ব্যবহার করছেন তবে আপনি সহজেই এর মতো তুলনা করতে পারেন:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.