Android में तारीखों की तुलना करने का सबसे अच्छा तरीका


102

मैं स्ट्रिंग तिथि प्रारूप में दिनांक की तुलना वर्तमान दिनांक से करने का प्रयास कर रहा हूं। यह मैंने ऐसा कैसे किया (परीक्षण नहीं किया है, लेकिन काम करना चाहिए), लेकिन पदावनत विधियों का उपयोग कर रहा हूं। एक विकल्प के लिए कोई अच्छा सुझाव? धन्यवाद।

पी एस मैं वास्तव में जावा में दिनांक सामान करने से नफरत करता हूं। एक ही काम करने के लिए बहुत सारे तरीके हैं, कि आप वास्तव में निश्चित नहीं हैं कि कौन सा सही है, इसलिए यहां मेरा सवाल है।

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

यह निश्चित रूप से काम करता है, मैंने उसी समाधान को दूसरे धागे में पोस्ट किया है लेकिन यहां नहीं क्योंकि सहयोगी तेजी से O_o था।
साइमन डोरियाक

स्वीकार करने से पहले, यह सुनिश्चित करना चाहता था। धन्यवाद। यह पूरी तरह से काम किया है और संक्षिप्त और सरल है जैसा चाहता था।
nunos

16
मुझे लगता है, कि dd / mm / yyyy के बजाय dd ​​/ MM / yyyy प्रारूप का उपयोग किया जाना चाहिए, क्योंकि "m" का अर्थ है मिनट्स, और "M" का अर्थ है महीना।
डेमविस

तुलना () विधि का उपयोग करना बेहतर नहीं होगा?
कक्षा एंड्रॉइड

25

आप तुलना () का उपयोग कर सकते हैं

यदि वर्तमान वस्तु अन्य वस्तु से कम है, तो वर्तमान संख्या अन्य वस्तु और शून्य से अधिक होने पर, दोनों वस्तुएं एक-दूसरे के बराबर होती हैं, तो तुलनात्मक विधि से ऋणात्मक संख्या वापस आनी चाहिए।

// 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
FYI करें, जैसे परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत, द्वारा का स्थान ले लिया java.time कक्षाएं। जावा- टाइम की अधिकांश कार्यक्षमता थ्रीटेन-बैकपोर्ट परियोजना में जावा 6 और जावा 7 में बैक-पोर्ट की गई है। तीनटीनबप में पहले के एंड्रॉइड (<26) के लिए अनुकूलित । देखें कि थ्रीटेनब का उपयोग कैसे करें…
तुलसी बोर्क

10

आप सीधे एक Calendarसे बना सकते हैं Date:

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

10

ध्यान दें कि कोड काम करने से पहले सही प्रारूप ("dd / MM / yyyy") है। "mm" का मतलब होता है पुदीना!

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

 }

FYI करें, जैसे परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत, द्वारा का स्थान ले लिया java.time कक्षाएं। जावा- टाइम की अधिकांश कार्यक्षमता थ्रीटेन-बैकपोर्ट परियोजना में जावा 6 और जावा 7 में बैक-पोर्ट की गई है। तीनटीनबप में पहले के एंड्रॉइड (<26) के लिए अनुकूलित । देखें कि थ्रीटेनब का उपयोग कैसे करें…
तुलसी बोर्क

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 अगर इस कैलेंडर का समय दूसरे के बाद का है।


1
धन्यवाद .. इसकी मदद मेरी।
pRaNaY

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 और ThreeTenABP

    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आज की तारीख का प्रतिनिधित्व करने वाले दो एस हमेशा बराबर होंगे।

प्रश्न: क्या मैं एंड्रॉइड पर java.time का उपयोग कर सकता हूं?

हाँ, java.time पुराने और नए Android उपकरणों पर अच्छी तरह से काम करता है। इसके लिए बस कम से कम जावा 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;
    }
}

इसके अलावा आप इस उदाहरण को GitHub और इस पोस्ट में देख सकते हैं ।


1

अपडेट: Joda समय पुस्तकालय रखरखाव मोड में है, और की ओर पलायन की सिफारिश java.time रूपरेखा है कि यह सफल होता है। ओले वीवी द्वारा उत्तर देखें ।


Joda समय

Java.util.Date और। कैलेन्डर वर्ग कुख्यात हैं। इनसे बचें। जावा 8 में या तो -टाइम या नए java.time पैकेज का उपयोग करें ।

LOCALDATE

यदि आप दिन के समय के बिना ही तारीख चाहते हैं, तो लोकलडेट क्लास का उपयोग करें।

समय क्षेत्र

वर्तमान तिथि प्राप्त करना समय क्षेत्र पर निर्भर करता है। मॉन्ट्रियल से पहले पेरिस में एक नई तारीख शुरू हुई। JVM के डिफ़ॉल्ट पर निर्भर होने के बजाय वांछित समय क्षेत्र निर्दिष्ट करें।

उदाहरण Joda-Time 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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.