[java] Android / Java-날짜 차이 (일)

아래 코드를 사용하여 현재 날짜 (1999 년 12 월 31 일 즉 mm / dd / yyyy 형식)를 얻고 있습니다.

Textview txtViewData;
txtViewDate.setText("Today is " +
        android.text.format.DateFormat.getDateFormat(this).format(new Date()));

2010-08-25 (예 : yyyy / mm / dd) 형식의 다른 날짜가 있습니다.

그래서 일수에서 날짜의 차이를 찾고 싶습니다. 일의 차이를 어떻게 알 수 있습니까?

(즉, CURRENT DATE-yyyy / mm / dd 형식의 날짜 차이를 찾고 싶습니다. )



답변

신뢰할 수있는 방법은 아니지만 JodaTime 을 사용하는 것이 좋습니다.

  Calendar thatDay = Calendar.getInstance();
  thatDay.set(Calendar.DAY_OF_MONTH,25);
  thatDay.set(Calendar.MONTH,7); // 0-11 so 1 less
  thatDay.set(Calendar.YEAR, 1985);

  Calendar today = Calendar.getInstance();

  long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis

다음은 근사치입니다 …

long days = diff / (24 * 60 * 60 * 1000);

문자열에서 날짜를 구문 분석하려면 다음을 사용할 수 있습니다.

  String strThatDay = "1985/08/25";
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
  Date d = null;
  try {
   d = formatter.parse(strThatDay);//catch exception
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }


  Calendar thatDay = Calendar.getInstance();
  thatDay.setTime(d); //rest is the same....

비록, 당신은 날짜 형식을 확신하기 때문에 … 당신은 또한 Integer.parseInt()숫자 값을 얻기 위해 그것의 부분 문자열에 할 수 있습니다.


답변

이것은 내 작품이 아니며 여기 에서 답을 찾았습니다 . 미래에 끊어진 링크를 원하지 않았습니다 :).

핵심은 일광 설정을 고려하기위한이 라인, ref Full Code입니다.

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

또는 TimeZone 매개 변수로 전달 하고 및 개체를 daysBetween()호출 setTimeZone()하십시오 .sDateeDate

그래서 여기에 간다 :

public static Calendar getDatePart(Date date){
    Calendar cal = Calendar.getInstance();       // get calendar instance
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
    cal.set(Calendar.MINUTE, 0);                 // set minute in hour
    cal.set(Calendar.SECOND, 0);                 // set second in minute
    cal.set(Calendar.MILLISECOND, 0);            // set millisecond in second

    return cal;                                  // return the date part
}

여기 에서 가져온 getDatePart ()

/**
 * This method also assumes endDate >= startDate
**/
public static long daysBetween(Date startDate, Date endDate) {
  Calendar sDate = getDatePart(startDate);
  Calendar eDate = getDatePart(endDate);

  long daysBetween = 0;
  while (sDate.before(eDate)) {
      sDate.add(Calendar.DAY_OF_MONTH, 1);
      daysBetween++;
  }
  return daysBetween;
}

뉘앙스 :
두 날짜의 차이를 찾는 것은 두 날짜를 빼고 결과를 (24 * 60 * 60 * 1000)으로 나누는 것만 큼 간단하지 않습니다. 사실, 그 오류입니다!

예 : 2007 년 3 월 24 일과 2007 년 3 월 25 일 두 날짜의 차이는 1 일이어야합니다. 그러나 위의 방법을 사용하면 영국에서는 0 일이됩니다!

직접 참조하십시오 (아래 코드). 밀리 초 방식으로 진행하면 반올림 오류가 발생하며 일광 절약 시간과 같은 작은 문제가 발생하면 오류가 가장 분명해집니다.

전체 코드 :

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateTest {

public class DateTest {

static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

public static void main(String[] args) {

  TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

  //diff between these 2 dates should be 1
  Date d1 = new Date("01/01/2007 12:00:00");
  Date d2 = new Date("01/02/2007 12:00:00");

  //diff between these 2 dates should be 1
  Date d3 = new Date("03/24/2007 12:00:00");
  Date d4 = new Date("03/25/2007 12:00:00");

  Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
  Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
  Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
  Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);

  printOutput("Manual   ", d1, d2, calculateDays(d1, d2));
  printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
  System.out.println("---");
  printOutput("Manual   ", d3, d4, calculateDays(d3, d4));
  printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}


private static void printOutput(String type, Date d1, Date d2, long result) {
  System.out.println(type+ "- Days between: " + sdf.format(d1)
                    + " and " + sdf.format(d2) + " is: " + result);
}

/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
  return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}

/** Using Calendar - THE CORRECT WAY**/
public static long daysBetween(Date startDate, Date endDate) {
  ...
}

산출:

수동-2007 년 1 월 1 일과 2007 년 1 월 2 일 사이의 날짜 : 1

달력-2007 년 1 월 1 일과 2007 년 1 월 2 일 사이의 날짜 : 1


수동-2007 년 3 월 24 일과 2007 년 3 월 25 일 사이의 날짜 : 0

달력-2007 년 3 월 24 일과 2007 년 3 월 25 일 사이의 날짜 : 1


답변

대부분의 답변은 귀하의 문제에 대해 훌륭하고 옳았습니다.

그래서 일수에서 날짜의 차이를 찾고 싶습니다. 일의 차이를 어떻게 알 수 있습니까?

모든 시간대에서 정확한 차이를 제공 할 수있는 매우 간단하고 직접적인 접근 방식을 제안합니다.

int difference=
((int)((startDate.getTime()/(24*60*60*1000))
-(int)(endDate.getTime()/(24*60*60*1000))));

그리고 그게 다야!


답변

jodatime API 사용

Days.daysBetween(start.toDateMidnight() , end.toDateMidnight() ).getDays()

여기서 ‘start’와 ‘end’는 DateTime 객체입니다. 날짜 문자열을 DateTime 개체로 구문 분석하려면 parseDateTime 메서드를 사용하십시오.

도 있습니다 안드로이드 특정의 JodaTime 라이브러리 .


답변

이 조각은 일광 절약 시간을 설명하며 O (1)입니다.

private final static long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;

private static long getDateToLong(Date date) {
    return Date.UTC(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
}

public static int getSignedDiffInDays(Date beginDate, Date endDate) {
    long beginMS = getDateToLong(beginDate);
    long endMS = getDateToLong(endDate);
    long diff = (endMS - beginMS) / (MILLISECS_PER_DAY);
    return (int)diff;
}

public static int getUnsignedDiffInDays(Date beginDate, Date endDate) {
    return Math.abs(getSignedDiffInDays(beginDate, endDate));
}


답변

이것은 나를위한 간단하고 최고의 계산이며 당신을위한 것일 수 있습니다.

       try {
            /// String CurrDate=  "10/6/2013";
            /// String PrvvDate=  "10/7/2013";
            Date date1 = null;
            Date date2 = null;
            SimpleDateFormat df = new SimpleDateFormat("M/dd/yyyy");
            date1 = df.parse(CurrDate);
            date2 = df.parse(PrvvDate);
            long diff = Math.abs(date1.getTime() - date2.getTime());
            long diffDays = diff / (24 * 60 * 60 * 1000);


            System.out.println(diffDays);

        } catch (Exception e1) {
            System.out.println("exception " + e1);
        }


답변

Correct Way첫 번째 날짜가 두 번째보다 이전 인 경우 샘 퀘스트의 대답에서에만 작동합니다. 또한 두 날짜가 하루 이내이면 1을 반환합니다.

이것이 저에게 가장 잘 맞는 솔루션입니다. 대부분의 다른 솔루션과 마찬가지로 일광 절약 오프셋이 잘못되어 1 년에 2 일 동안 잘못된 결과가 표시됩니다.

private final static long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;

long calculateDeltaInDays(Calendar a, Calendar b) {

    // Optional: avoid cloning objects if it is the same day
    if(a.get(Calendar.ERA) == b.get(Calendar.ERA)
            && a.get(Calendar.YEAR) == b.get(Calendar.YEAR)
            && a.get(Calendar.DAY_OF_YEAR) == b.get(Calendar.DAY_OF_YEAR)) {
        return 0;
    }
    Calendar a2 = (Calendar) a.clone();
    Calendar b2 = (Calendar) b.clone();
    a2.set(Calendar.HOUR_OF_DAY, 0);
    a2.set(Calendar.MINUTE, 0);
    a2.set(Calendar.SECOND, 0);
    a2.set(Calendar.MILLISECOND, 0);
    b2.set(Calendar.HOUR_OF_DAY, 0);
    b2.set(Calendar.MINUTE, 0);
    b2.set(Calendar.SECOND, 0);
    b2.set(Calendar.MILLISECOND, 0);
    long diff = a2.getTimeInMillis() - b2.getTimeInMillis();
    long days = diff / MILLISECS_PER_DAY;
    return Math.abs(days);
}