Android'de tarihleri ​​karşılaştırmanın en iyi yolu


102

String formatındaki bir tarihi güncel tarihle karşılaştırmaya çalışıyorum. Ben böyle yaptım (test etmedim ama çalışmalı), ancak kullanımdan kaldırılmış yöntemler kullanıyorum. Bir alternatif için iyi bir öneriniz var mı? Teşekkürler.

Not: Java'da randevu yapmaktan gerçekten nefret ediyorum. Aynı şeyi yapmanın o kadar çok yolu var ki, hangisinin doğru olduğundan gerçekten emin değilsiniz, dolayısıyla benim sorum burada.

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 yılında en iyi yolu içermeyen Calendar, SimpleDateFormat, Dateveya diğer uzun eskimiş Java tarih ve saat sınıfların herhangi. Bunun yerine java.time, modern Java tarih ve saat API'sini kullanın . Evet, Android'de kullanabilirsiniz. Daha eski Android için Android Project'te ThreeTenABP'yi kullanma bölümüne bakın .
Ole VV

Yanıtlar:


221

Kodunuz küçültülebilir

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

veya

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

emin çalışıyor, aynı çözümü başka iş parçacığına gönderdim ama burada değil çünkü meslektaşım daha hızlıydı O_o.
Simon Dorociak

sadece kabul etmeden önce emin olmak istedim. Teşekkürler. mükemmel çalıştı ve istendiği gibi kısa ve basit.
nunos

16
Gg / aa / yyyy yerine gg / AA / yyyy formatının kullanılması gerektiğini düşünüyorum çünkü "m" dakika ve "A" ay anlamına geliyor.
Demwis

CompareTo () yöntemini kullanmak daha iyi olmaz mı?
sınıf Android

25

CompareTo () kullanabilirsiniz

CompareTo yöntemi, geçerli nesne diğer nesneden küçükse negatif sayı, geçerli nesne diğer nesneden büyükse pozitif sayı ve her iki nesne de birbirine eşitse sıfır döndürmelidir.

// 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
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatsupplanted şimdi mirası, java.time sınıfları. ThreeTen-Backport projesinde java.time işlevlerinin çoğu Java 6 ve Java 7'ye geri aktarılmıştır . ThreeTenABP'de önceki Android (<26) için daha fazla uyarlanmıştır . Bkz ... ThreeTenABP nasıl kullanılır .
Basil Bourque

10

Doğrudan bir oluşturabilirsiniz Calendarbir den Date:

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

10

Kod çalışmadan önce doğru biçimin ("gg / AA / yyyy") olduğuna dikkat edin. "mm", dakika anlamına gelir!

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

 }

Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatsupplanted şimdi mirası, java.time sınıfları. ThreeTen-Backport projesinde java.time işlevlerinin çoğu Java 6 ve Java 7'ye geri aktarılmıştır . ThreeTenABP'de önceki Android (<26) için daha fazla uyarlanmıştır . Bkz ... ThreeTenABP nasıl kullanılır .
Basil 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();
    }

true geri döner .. ve ayrıca date.before ve date.equal yardımıyla önce ve eşit olarak kontrol edebilirsiniz ..


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

Bu Takvimin temsil ettiği zamanı, verilen Takvimin temsil ettiği zamanla karşılaştırır.

İki Takvimin saatleri eşitse 0, bu Takvimin zamanı diğerinden önceyse -1, bu Takvimin zamanı diğerinden sonra ise 1 döndürür.


1
Teşekkürler .. Bana yardım et.
pRaNaY

2

tarihi Takvim'e çevirin ve hesaplamalarınızı orada yapın. :)

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)

Veya:

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

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

2

Modern cevap zamanı.

java.time ve 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");
    }

Bu kodu şimdi çalıştırdığımda çıktı şuydu:

Katalog eski

Tüm zaman dilimlerinde asla aynı tarih olmadığından, için açık bir saat dilimi verin LocalDate.now. Kataloğun tüm zaman dilimlerinde aynı anda sona ermesini istiyorsanız,ZoneOffset.UTC kullanıcıları UTC kullandığınızı bildirdiğiniz sürece .

Modern Java tarih ve saat API'si olan java.time kullanıyorum. Tarih-saat sınıflar, kullanılan Calendar, SimpleDateFormatve Datetüm kötü tasarlanmış ve neyse uzun güncelliğini yitirmiş durumda. Ayrıca ismine rağmen a Datebir tarihi değil, zamanın bir noktasını temsil eder. Bunun bir sonucu: bugün bir yeni oluşturulan, 15 Şubat 2019 olmasına rağmen Datenesne zaten sonra bir (şimdiye değil eşit) Dateayrıştırma nesneyi 15/02/2019. Bu bazılarının kafasını karıştırıyor. Bunun aksine modern LocalDate, günün saati olmayan (ve saat dilimi olmayan) bir tarihtir, bu nedenle LocalDatebugünün tarihini temsil eden iki tarih her zaman eşit olacaktır.

Soru: Android'de java.time kullanabilir miyim?

Evet, java.time eski ve daha yeni Android cihazlarda iyi çalışır. Sadece en az Java 6 gerektirir .

  • Java 8 ve sonraki sürümlerinde ve daha yeni Android cihazlarda (API düzeyi 26'dan itibaren) modern API yerleşik olarak gelir.
  • Java 6 ve 7'de, modern sınıfların arka portu olan ThreeTen Backport'u edinin (JSR 310 için ThreeTen; alttaki bağlantılara bakın).
  • (Daha eski) Android'de ThreeTen Backport'un Android sürümünü kullanın. Adı ThreeTenABP. Tarih ve saat sınıflarını org.threeten.bpalt paketlerle içe aktardığınızdan emin olun .

Bağlantılar


1

Bunu deneyebilirsin

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

ve today.getTime()değeri almak ve karşılaştırmak için kullanabilirsiniz.


1

Bazen tarih içeren bir liste yapmamız gerekir.

bugün saatle

dün ile dün

23/06/2017 ile diğer günler

Bunu yapmak için şimdiki zamanı verilerimizle karşılaştırmamız gerekiyor.

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

Ayrıca bu örneği GitHub'da ve bu yazıda kontrol edebilirsiniz .


1

Güncelleme: Joda-Time kütüphane bakım modunda olduğunu ve göç önerir java.time bunu başarır çerçeve. Bkz Ole VV tarafından cevap .


Joda-Zaman

Java.util.Date ve .Calendar sınıfları herkesin bildiği gibi zahmetlidir. Onlardan kaçının. Java 8'de Joda-Time veya yeni java.time paketini kullanın .

Yerel Tarih

Günün saati olmadan yalnızca tarih istiyorsanız, LocalDate sınıfını kullanın.

Saat dilimi

Güncel tarihi almak saat dilimine bağlıdır. Montréal'den önce Paris'te yeni bir tarih gelir. JVM'nin varsayılanına bağlı olmak yerine istenen saat dilimini belirtin.

Joda-Time 2.3'teki örnek.

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

Kotlin, operatörlerin aşırı yüklenmesini destekliyor

Kotlin'de tarihleri ​​karşılaştırma operatörleriyle kolayca karşılaştırabilirsiniz. Çünkü Kotlin zaten operatörlerin aşırı yüklenmesini destekliyor. Yani tarih nesnelerini karşılaştırmak için:

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

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

ve takvim nesneleri kullanıyorsanız, aşağıdaki gibi kolayca karşılaştırabilirsiniz:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.