วิธีที่ดีที่สุดในการเปรียบเทียบวันที่ใน Android


102

ฉันกำลังพยายามเปรียบเทียบวันที่ในรูปแบบ String กับวันที่ปัจจุบัน นี่คือวิธีที่ฉันทำ (ยังไม่ได้ทดสอบ แต่ควรได้ผล) แต่กำลังใช้วิธีที่เลิกใช้แล้ว มีข้อเสนอแนะที่ดีสำหรับทางเลือกอื่นหรือไม่? ขอบคุณ.

ปล. ฉันเกลียดการทำ Date ใน Java มาก มีหลายวิธีในการทำสิ่งเดียวกันซึ่งคุณไม่แน่ใจจริงๆว่าวิธีใดเป็นวิธีที่ถูกต้องดังนั้นคำถามของฉันที่นี่

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 วันที่และเวลาเรียน แทนที่จะใช้java.timeทันสมัย Java วันที่และเวลา API ใช่คุณสามารถใช้งานได้บน Android สำหรับ Android เก่าดูวิธีการใช้ ThreeTenABP ในโครงการ
Ole VV

คำตอบ:


220

รหัสของคุณอาจลดลงเป็น

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
Simon Dorociak

แค่อยากให้แน่ใจก่อนยอมรับ ขอบคุณ. มันทำงานได้อย่างสมบูรณ์และกระชับและเรียบง่ายอย่างที่ต้องการ
แม่ชี

16
ฉันคิดว่าควรใช้รูปแบบ dd / MM / yyyy แทน dd / mm / yyyy เนื่องจาก "m" หมายถึงนาทีและ "M" หมายถึงเดือน
Demwis

จะดีกว่าไหมถ้าใช้วิธี CompareTo ()
คลาส Android

25

คุณสามารถใช้CompareTo ()

เมธอด CompareTo ต้องส่งคืนจำนวนลบหากวัตถุปัจจุบันน้อยกว่าวัตถุอื่นจำนวนบวกถ้าวัตถุปัจจุบันมากกว่าวัตถุอื่นและเป็นศูนย์ถ้าวัตถุทั้งสองมีค่าเท่ากัน

// 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ชั้นเรียน ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 & Java 7 ในThreeTen-ย้ายกลับโครงการ ดัดแปลงเพิ่มเติมสำหรับก่อนหน้านี้ Android (<26) ในThreeTenABP ดูวิธีใช้ ThreeTenABP … .
Basil Bourque

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

 }

FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่ด้วยjava.timeชั้นเรียน ส่วนใหญ่ของjava.timeการทำงานจะกลับรังเพลิง Java 6 & Java 7 ในThreeTen-ย้ายกลับโครงการ ดัดแปลงเพิ่มเติมสำหรับก่อนหน้านี้ Android (<26) ในThreeTenABP ดูวิธีใช้ 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();
    }

มันคืนค่าจริง .. และคุณยังสามารถตรวจสอบก่อนและเท่ากับได้ด้วยความช่วยเหลือของ date.before และ date.equal ..


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นานเท่าที่คุณแจ้งให้ผู้ใช้ทราบว่าคุณกำลังใช้ UTC

ฉันใช้ java.time ซึ่งเป็นวันที่และเวลาของ Java API ที่ทันสมัย เรียนวันที่เวลาที่คุณใช้Calendar, SimpleDateFormatและDate, มีทั้งหมดออกแบบมาไม่ดีและโชคดีที่ล้าสมัยยาว แม้จะมีชื่อ a Dateไม่ได้แสดงถึงวันที่ แต่เป็นจุดในเวลา หนึ่งผลนี้คือ: แม้ว่าในวันนี้คือ 15 กุมภาพันธ์ 2019, ที่สร้างขึ้นใหม่Dateวัตถุที่มีอยู่แล้วหลัง (เพื่อไม่เท่ากับบริการ) วัตถุจากการแยกDate 15/02/2019สิ่งนี้ทำให้บางคนสับสน ตรงกันข้ามกับสิ่งนี้ที่ทันสมัยLocalDateคือวันที่ที่ไม่มีเวลาของวัน (และไม่มีเขตเวลา) ดังนั้นสองLocalDateวินาทีที่แสดงวันที่ของวันนี้จะเท่ากันเสมอ

คำถาม: ฉันสามารถใช้ java.time บน Android ได้หรือไม่?

ใช่ java.time ทำงานได้ดีบนอุปกรณ์ Android รุ่นเก่าและใหม่กว่า มันก็ต้องมีอย่างน้อยJava 6

  • ใน Java 8 ขึ้นไปและบนอุปกรณ์ Android รุ่นใหม่ ๆ (จาก API ระดับ 26) API ที่ทันสมัยมาในตัว
  • ใน Java 6 และ 7 รับ ThreeTen Backport ซึ่งเป็นแบ็คพอร์ตของคลาสสมัยใหม่ (ThreeTen สำหรับ JSR 310 ดูลิงก์ที่ด้านล่าง)
  • บน Android (รุ่นเก่ากว่า) ใช้ ThreeTen Backport รุ่น Android เรียกว่า ThreeTenABP และตรวจสอบให้แน่ใจว่าคุณนำเข้าคลาสวันที่และเวลาจาก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กรอบที่ประสบความสำเร็จมัน ดูคำตอบโดย Ole VV


Joda-Time

คลาส java.util.Date และ. ปฏิทินเป็นปัญหาที่น่าอับอาย หลีกเลี่ยงพวกเขา ใช้Joda-Timeหรือแพ็คเกจ java.time ใหม่ใน Java 8

LocalDate

หากคุณต้องการวันที่เท่านั้นโดยไม่มีเวลาของวันให้ใช้คลาส 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

Kotlin สนับสนุนผู้ปฏิบัติงานที่ทำงานหนักเกินไป

ใน Kotlin คุณสามารถเปรียบเทียบวันที่กับตัวดำเนินการเปรียบเทียบได้อย่างง่ายดาย เนื่องจาก Kotlin รองรับผู้ปฏิบัติงานที่บรรทุกเกินกำลังอยู่แล้ว เพื่อเปรียบเทียบวัตถุวันที่:

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.