Android에서 날짜를 비교하는 가장 좋은 방법


102

문자열 형식의 날짜를 현재 날짜와 비교하려고합니다. 이것이 내가 한 방법이지만 (테스트를 거치지 않았지만 작동해야 함) 더 이상 사용되지 않는 방법을 사용하고 있습니다. 대안에 대한 좋은 제안이 있습니까? 감사.

추신 나는 Java로 Date 작업을 정말 싫어합니다. 동일한 작업을 수행하는 방법이 너무 많아서 어느 것이 올바른지 확실하지 않으므로 여기에 제 질문이 있습니다.

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최신 Java 날짜 및 시간 API를 사용하십시오 . 예, Android에서 사용할 수 있습니다. 이전 Android의 경우 Android 프로젝트에서 ThreeTenABP를 사용하는 방법을 참조하세요 .
Ole VV

답변:


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

그것은 확실히 작동합니다. 다른 스레드에 동일한 솔루션을 게시했지만 동료가 더 빠르기 때문에 여기에는 없습니다.
Simon Dorociak

수락하기 전에 확인하고 싶었습니다. 감사. 완벽하게 작동하고 간결하고 간단합니다.
nunos

16
"m"은 분을 의미하고 "M"은 월을 의미하기 때문에 dd / mm / yyyy 대신 dd / MM / yyyy 형식을 사용해야한다고 생각합니다.
Demwis

compareTo () 메서드를 사용하는 것이 더 좋지 않습니까?
수업 Android

25

compareTo () 사용할 수 있습니다.

CompareTo 메서드는 현재 개체가 다른 개체보다 작 으면 음수를 반환하고, 현재 개체가 다른 개체보다 크면 양수를, 두 개체가 서로 같으면 0을 반환해야합니다.

// 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
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat에 의해 대체 지금 레거시, java.time의 클래스. 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 및 Java 7로 백 포트됩니다 . ThreeTenABP의 이전 Android (<26)에 맞게 추가로 조정되었습니다 . 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")입니다. "mm"는 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;
}

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

 }

참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat에 의해 대체 지금 레거시, java.time의 클래스. 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 및 Java 7로 백 포트됩니다 . ThreeTenABP의 이전 Android (<26)에 맞게 추가로 조정되었습니다 . 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();
    }

true ..를 반환하고 date.before 및 date.equal ..의 도움으로 before와 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 날짜 및 시간 API 인 java.time을 사용하고 있습니다. 날짜 시간 수업은 당신이 사용했던 Calendar, SimpleDateFormat그리고 Date모든 잘못 설계 다행히 긴 구식이된다. 또한 이름에도 불구하고 a Date는 날짜가 아니라 특정 시점을 나타냅니다. 이로 인한 한 가지 결과는 오늘이 2019 년 2 월 15 일 임에도 불구하고 새로 생성 된 Date객체가 파싱에서 이미 객체 뒤에 (같지 않음) 있다는 Date것입니다 15/02/2019. 이것은 일부를 혼란스럽게합니다. 이와 반대로 현대 LocalDate는 시간이없는 (시간대가없는) LocalDate날짜 이므로 오늘 날짜를 나타내는 두 개의 는 항상 동일합니다.

질문 : Android에서 java.time을 사용할 수 있습니까?

예, java.time은 이전 및 최신 Android 장치에서 잘 작동합니다. 최소한 Java 6 만 필요합니다 .

  • Java 8 이상 및 최신 Android 장치 (API 레벨 26부터)에는 최신 API가 내장되어 있습니다.
  • Java 6 및 7에서는 최신 클래스의 백 포트 인 ThreeTen 백 포트를 가져옵니다 (JSR 310의 경우 ThreeTen, 하단의 링크 참조).
  • (이전) 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

때때로 우리는 날짜 목록을 작성해야합니다.

오늘 시간

어제와 어제

2017 년 6 월 23 일의 다른 날

이를 위해서는 현재 시간을 데이터와 비교해야합니다.

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 및 .Calendar 클래스는 문제가있는 것으로 악명이 높습니다. 그들을 피하십시오. Joda-Time 또는 Java 8의 새로운 java.time 패키지를 사용하십시오 .

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.