Bagaimana untuk membandingkan tanggal di Java?

Bagaimana cara membandingkan tanggal pada antara di pulau Jawa?

Contoh:

date1 adalah 22-02-2010
date2 adalah 07-04-2010 hari ini
date3 adalah 25-12-2010

date3 selalu lebih besar dari date1 dan date2 selalu hari ini. Bagaimana cara memverifikasi jika hari ini's upload di antara date1 dan tanggal 3?

Larutan

[Tanggal][1] memiliki [sebelum][2] dan [setelah][3] metode dan dapat dibandingkan satu sama lain][4] sebagai berikut:

if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
    // In between
}

Untuk yang inklusif perbandingan:


if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
    /* historyDate 
Komentar (5)

Gunakan compareTo:

date1.compareTo(date2);

Komentar (4)

Berikut ini adalah cara paling umum dari membandingkan tanggal. Tapi saya lebih suka yang pertama

Pendekatan-1 : Menggunakan Tanggal.sebelum(), Date.setelah() dan Tanggal.sama dengan()

            if(date1.after(date2)){
                System.out.println("Date1 is after Date2");
            }

            if(date1.before(date2)){
                System.out.println("Date1 is before Date2");
            }

            if(date1.equals(date2)){
                System.out.println("Date1 is equal Date2");
            }

Pendekatan-2 : Upload.compareTo()


           if(date1.compareTo(date2)>0){
                System.out.println("Date1 is after Date2");
            }else if(date1.compareTo(date2)
Komentar (1)

tl;dr

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween = 
    ( ! today.isBefore( localDate1 ) )  // “not-before” is short for “is-equal-to or later-than”.
    &&
    today.isBefore( localDate3 ) ; 

Atau, lebih baik, jika anda menambahkan ThreeTen-Tambahan perpustakaan untuk proyek anda.

LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)

Setengah terbuka pendekatan, di mana awal inklusif sementara ending exclusive.

Bad Pilihan Format

By the way, itu adalah pilihan yang buruk dari format teks representasi dari tanggal atau tanggal-nilai waktu. Bila mungkin, tetap dengan standar ISO 8601 format. ISO 8601 format yang jelas, dapat dimengerti seluruh budaya manusia, dan mudah untuk mengurai oleh mesin. Untuk tanggal-satunya nilai, standar format YYYY-MM-DD. Perhatikan cara format ini memiliki keuntungan yang kronologis ketika diurutkan berdasarkan abjad.

LocalDate

The LocalDate kelas merupakan tanggal-satunya nilai tanpa waktu-dari-hari dan tanpa zona waktu. Zona waktu adalah penting dalam menentukan tanggal. Untuk saat tertentu, tanggal bervariasi di seluruh dunia dengan zona. Misalnya, beberapa menit setelah tengah malam di Paris adalah hari baru sementara masih "kemarin" di Montréal Québec.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

Sebagai input string format non-standar, kita harus menentukan format pola untuk mencocokkan.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );

Gunakan itu untuk mengurai input string.

LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );

Di saat-saat bekerja, biasanya terbaik untuk menentukan rentang waktu Setengah Terbuka pendekatan mana awal inklusif sedangkan ending exclusive. Jadi kami ingin tahu jika hari ini adalah hari yang sama atau paling lambat awal dan juga sebelum berhenti. A briefer cara untuk mengatakan "sama atau lebih dari awal" adalah "tidak sebelum memulai".

Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

Lihat Jawaban oleh gstackoverflow menampilkan daftar perbandingan metode yang dapat anda hubungi.

Tentang jawa.waktu

The jawa.waktu kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan merepotkan tua legacy tanggal waktu kelas seperti jawa.util.Tanggal, Kalender, & SimpleDateFormat. The Joda-Waktu proyek, sekarang di maintenance mode, menyarankan migrasi ke jawa.waktu kelas. Untuk mempelajari lebih lanjut, lihat Oracle Tutorial. Dan pencarian Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi JSR 310. Di mana untuk memperoleh jawa.waktu kelas?

  • Java SE 8 dan SE 9 dan kemudian
  • Built-in.
  • Bagian dari standar Java API dengan mengubah pengaturan pelaksanaan.
  • Jawa 9 menambahkan beberapa fitur minor dan perbaikan.
  • Java SE 6 dan SE 7
  • Jauh dari jawa.waktu fungsi back-porting ke Jawa 6 & 7 di ThreeTen-Backport.
  • Android
  • The ThreeTenABP proyek menyesuaikan ThreeTen-Backport (disebutkan di atas) untuk Android secara khusus.
  • See Cara menggunakan ThreeTenABP.... The ThreeTen-Extra proyek meluas jawa.waktu dengan kelas tambahan. Proyek ini adalah ajang pembuktian bagi masa depan mungkin penambahan jawa.waktu. Anda mungkin menemukan beberapa kelas yang berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih.

    UPDATE: Ini "Joda-Waktu" bagian bawah dibiarkan utuh sebagai sejarah. The Joda-Waktu proyek, sekarang di maintenance mode, menyarankan migrasi ke jawa.waktu kelas. Joda-Waktu

    Jawaban lain yang benar berkaitan dengan paket java.util.Tanggal dan jawa.util.Kalender kelas-kelas. Tetapi kelas-kelas yang sangat merepotkan. Jadi di sini's beberapa contoh kode menggunakan Joda-Waktu 2.3 perpustakaan. Jika anda benar-benar ingin kencan tanpa ada porsi waktu dan zona waktu, kemudian gunakan LocalDate kelas dalam Joda-Waktu. Bahwa class menyediakan metode perbandingan seperti compareTo (digunakan dengan Jawa Comparator), isBefore, isAfter, dan sama dengan. Input...

String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";

Menentukan formatter menggambarkan input string...

DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );

Menggunakan formatter untuk mengurai string ke LocalDate benda-benda...

LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );

boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );

Dump untuk konsol...

System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );

Ketika menjalankan...

Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true

Begitu melihat apakah kedua adalah antara lain dua (secara eksklusif, artinya tidak sama dengan baik endpoint)...

boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );

Bekerja Dengan Rentang Waktu Yang

Jika anda bekerja dengan bentang waktu, saya sarankan mengeksplorasi dalam Joda-Waktu perkuliahan: Durasi, Interval, dan Periode. Metode seperti tumpang tindih dan berisi membuat perbandingan mudah. Untuk teks representasi, lihat standar ISO 8601 ini:

  • durasi
    Format: PnYnMnDTnHnMnS
    Contoh: P3Y6M4DT12H30M5S
    (Berarti "tiga tahun, enam bulan, empat hari, dua belas jam, tiga puluh menit, dan lima detik")
  • interval
    Format: start/end
    Contoh: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z Joda-Waktu kelas dapat bekerja dengan string di kedua format tersebut, baik sebagai masukan (parsing) dan output (menghasilkan string). Joda-Kali melakukan perbandingan dengan menggunakan Setengah Terbuka pendekatan mana awal rentang inklusif sedangkan ending exclusive. Pendekatan ini adalah bijaksana untuk menangani rentang waktu. Pencarian StackOverflow untuk info lebih lanjut.
Komentar (0)

Membandingkan dua tanggal:

  Date today = new Date();                   
  Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
  System.out.println("My Date is"+myDate);    
  System.out.println("Today Date is"+today);
  if (today.compareTo(myDate)0)
      System.out.println("Today Date is Greater than my date"); 
  else
      System.out.println("Both Dates are equal"); 
Komentar (3)

Update Java 8 dan kemudian

Metode ini ada di LocalDate, LocalTime, dan LocalDateTime kelas.

Kelas-kelas yang dibangun ke Jawa 8 dan kemudian. Banyak dari jawa.waktu fungsi back-porting ke Jawa 6 & 7 di ThreeTen-Backport dan selanjutnya disesuaikan untuk Android di ThreeTenABP (lihat Cara menggunakan...).

Komentar (3)

Anda dapat menggunakan [Tanggal.getTime()][1] yaitu:

Mengembalikan jumlah milidetik sejak 1 januari 1970, 00:00:00 GMT yang diwakili oleh objek Tanggal.

Ini berarti anda dapat membandingkan mereka seperti angka:


if (date1.getTime() 
Komentar (0)

Gunakan getTime() untuk mendapatkan nilai numerik dari tanggal, dan kemudian membandingkan dengan menggunakan kembali nilai-nilai.

Komentar (0)

Coba ini

public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
        SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
        Date date1 = dateFormat.parse(psDate1);
        Date date2 = dateFormat.parse(psDate2);
        if(date2.after(date1)) {
            return true;
        } else {
            return false;
        }
    }
Komentar (0)

Metode ini bekerja untuk saya:

 public static String daysBetween(String day1, String day2) {
    String daysBetween = "";
    SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {
        Date date1 = myFormat.parse(day1);
        Date date2 = myFormat.parse(day2);
        long diff = date2.getTime() - date1.getTime();
        daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return daysBetween;
}
Komentar (1)

Kode ini menentukan hari dalam beberapa durasi.. berdasarkan KOREA lokal

    Calendar cstart = Calendar.getInstance(Locale.KOREA);
    cstart.clear();
    cstart.set(startyear, startmonth, startday);

    Calendar cend = Calendar.getInstance(Locale.KOREA);
    cend.clear();
    cend.set(endyear, endmonth, endday);

    Calendar c = Calendar.getInstance(Locale.KOREA);

    if(c.after(cstart) && c.before(cend)) {
        // today is in startyear/startmonth/startday ~ endyear/endmonth/endday
    }
Komentar (0)