Cara terbaik untuk membandingkan tanggal di Android

102

Saya mencoba membandingkan tanggal dalam format String dengan tanggal saat ini. Beginilah cara saya melakukannya (belum diuji, tetapi seharusnya berfungsi), tetapi saya menggunakan metode yang sudah usang. Ada saran bagus untuk alternatif? Terima kasih.

PS Saya sangat benci melakukan hal-hal Kencan di Jawa. Ada begitu banyak cara untuk melakukan hal yang sama, sehingga Anda benar-benar tidak yakin mana yang benar, maka pertanyaan saya di sini.

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;
}
biarawati
sumber
4
2018 cara terbaik tidak melibatkan Calendar, SimpleDateFormat, Dateatau salah satu usang tanggal Jawa dan waktu kelas panjang lainnya. Sebagai gantinya gunakan java.time, API tanggal dan waktu Java modern . Ya, Anda dapat menggunakannya di Android. Untuk Android yang lebih lama, lihat Cara menggunakan ThreeTenABP di Proyek Android .
Ole VV

Jawaban:

220

Kode Anda dapat dikurangi menjadi

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

atau

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}
JB Nizet
sumber
itu berfungsi dengan pasti, saya memposting solusi yang sama di utas lain tetapi tidak di sini karena kolega lebih cepat O_o.
Simon Dorociak
hanya ingin memastikan, sebelum menerima. Terima kasih. ini bekerja dengan sempurna dan ringkas serta sesederhana yang diinginkan.
nunos
16
Menurut saya, harus ada format hh / mm / tttt daripada dd / mm / tttt, karena "m" berarti menit, dan "M" berarti bulan.
Demwis
Bukankah lebih baik menggunakan metode bandingkanTo ()?
kelas Android
25

Anda dapat menggunakan bandingkanTo ()

Metode CompareTo harus mengembalikan angka negatif jika objek saat ini lebih kecil dari objek lain, angka positif jika objek saat ini lebih besar dari objek lain dan nol jika kedua objek sama satu sama lain.

// 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 "); 
}
IntelliJ Amiya
sumber
1
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan, digantikan oleh java.time kelas. Sebagian besar fungsionalitas java.time di -back-port ke Java 6 & Java 7 dalam proyek ThreeTen-Backport . Diadaptasi lebih lanjut untuk Android sebelumnya (<26) di ThreeTenABP . Lihat Cara menggunakan ThreeTenABP… .
Basil Bourque
10

Anda dapat langsung membuat Calendardari Date:

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

Perhatikan bahwa format yang benar adalah ("dd / MM / yyyy") sebelum kode berfungsi. "mm" artinya minuts!

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

 }
Siva krishna
sumber
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan, digantikan oleh java.time kelas. Sebagian besar fungsionalitas java.time di -back-port ke Java 6 & Java 7 dalam proyek ThreeTen-Backport . Diadaptasi lebih lanjut untuk Android sebelumnya (<26) di ThreeTenABP . Lihat Cara menggunakan ThreeTenABP… .
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();
    }

itu mengembalikan true .. dan Anda juga dapat memeriksa sebelum dan sama dengan bantuan date.before dan date.equal ..

Dilavar Malek
sumber
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));

Membandingkan waktu yang diwakili oleh Kalender ini dengan yang diwakili oleh Kalender tertentu.

Mengembalikan 0 jika waktu kedua Kalender sama, -1 jika waktu Kalender ini sebelum yang lain, 1 jika waktu Kalender ini setelah yang lain.

Kirit Vaghela
sumber
1
Terima kasih .. Ini membantu saya.
pRaNaY
2

ubah tanggal menjadi Kalender dan buat perhitungan Anda di sana. :)

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)

Atau:

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

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}
Nuno Gonçalves
sumber
2

Saatnya untuk jawaban modern.

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

Ketika saya menjalankan kode ini sekarang, hasilnya adalah:

Katalog sudah usang

Karena tidak pernah ada tanggal yang sama di semua zona waktu, berikan zona waktu yang eksplisit ke LocalDate.now. Jika Anda ingin katalog kedaluwarsa pada waktu yang sama di semua zona waktu, Anda dapat memberikan ZoneOffset.UTCselama Anda memberi tahu pengguna bahwa Anda menggunakan UTC.

Saya menggunakan java.time, API tanggal dan waktu Java modern. Kelas tanggal-waktu yang Anda gunakan Calendar,, SimpleDateFormatdan Date, semuanya dirancang dengan buruk dan untungnya sudah lama usang. Juga meskipun nama a Datetidak mewakili tanggal, tetapi suatu titik waktu. Salah satu konsekuensi dari ini adalah: meskipun hari ini adalah 15 Februari 2019, baru dibuat Dateobjek sudah setelah (sehingga tidak sama dengan) sebuah Dateobjek dari parsing 15/02/2019. Ini membingungkan beberapa orang. Berlawanan dengan ini, modern LocalDateadalah tanggal tanpa waktu (dan tanpa zona waktu), jadi dua LocalDates yang mewakili tanggal hari ini akan selalu sama.

Pertanyaan: Bisakah saya menggunakan java.time di Android?

Ya, java.time berfungsi dengan baik di perangkat Android yang lebih lama dan lebih baru. Ini hanya membutuhkan setidaknya Java 6 .

  • Di Java 8 dan yang lebih baru dan pada perangkat Android yang lebih baru (dari API level 26), API modern sudah ada di dalamnya.
  • Di Java 6 dan 7 dapatkan ThreeTen Backport, backport kelas modern (ThreeTen untuk JSR 310; lihat link di bagian bawah).
  • Di Android (lebih lama), gunakan ThreeTen Backport edisi Android. Ini disebut ThreeTenABP. Dan pastikan Anda mengimpor kelas tanggal dan waktu dari org.threeten.bpdengan subpaket.

Tautan

Ole VV
sumber
1

Anda bisa mencoba ini

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

dan Anda bisa menggunakan today.getTime()untuk mengambil nilai dan membandingkan.

Anurag Ramdasan
sumber
1

Terkadang kita perlu membuat daftar dengan tanggal, seperti

hari ini dengan jam

kemarin dengan kemarin

hari lain dengan 23/06/2017

Untuk membuatnya, kita perlu membandingkan waktu saat ini dengan data kita.

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

Anda juga dapat memeriksa contoh ini di GitHub dan posting ini .

Cabezas
sumber
1

Update: The Joda-Time perpustakaan sekarang dalam pemeliharaan-mode, dan merekomendasikan bermigrasi ke java.time kerangka yang berhasil itu. Lihat Jawaban oleh Ole VV .


Waktu Joda

Kelas java.util.Date dan .Calendar sangat merepotkan. Hindari mereka. Gunakan Joda-Time atau paket java.time baru di Java 8.

LocalDate

Jika Anda ingin tanggal-saja tanpa waktu-hari, gunakan kelas LocalDate.

Zona waktu

Mendapatkan tanggal saat ini tergantung pada zona waktu. Tanggal baru bergulir di Paris sebelum Montréal. Tentukan zona waktu yang diinginkan daripada bergantung pada default JVM.

Contoh di 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 );
Basil Bourque
sumber
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..//
}
kartik_g
sumber
0

Kotlin mendukung overloading operator

Di Kotlin, Anda dapat dengan mudah membandingkan tanggal dengan membandingkan operator. Karena Kotlin sudah mendukung operator overloading. Jadi untuk membandingkan objek tanggal:

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

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

dan jika Anda menggunakan objek kalender, Anda dapat dengan mudah membandingkannya seperti ini:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
Khaled Qasem
sumber