Android/Java - Date Difference in days

前端 未结 18 1248
感动是毒
感动是毒 2020-11-22 14:17

I am getting the current date (in format 12/31/1999 i.e. mm/dd/yyyy) as using the below code:

Textview txtViewData;
txtViewDate.setText(\"Today is \" +
              


        
18条回答
  •  孤独总比滥情好
    2020-11-22 14:47

    This is NOT my work, found the answer here. did not want a broken link in the future :).

    The key is this line for taking daylight setting into account, ref Full Code.

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

    or try passing TimeZone as a parameter to daysBetween() and call setTimeZone() in the sDate and eDate objects.

    So here it goes:

    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() taken from here

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

    The Nuances: Finding the difference between two dates isn't as straightforward as subtracting the two dates and dividing the result by (24 * 60 * 60 * 1000). Infact, its erroneous!

    For example: The difference between the two dates 03/24/2007 and 03/25/2007 should be 1 day; However, using the above method, in the UK, you'll get 0 days!

    See for yourself (code below). Going the milliseconds way will lead to rounding off errors and they become most evident once you have a little thing like Daylight Savings Time come into the picture.

    Full Code:

    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) {
      ...
    }
    

    OUTPUT:

    Manual - Days between: 01-Jan-2007 and 02-Jan-2007 is: 1

    Calendar - Days between: 01-Jan-2007 and 02-Jan-2007 is: 1


    Manual - Days between: 24-Mar-2007 and 25-Mar-2007 is: 0

    Calendar - Days between: 24-Mar-2007 and 25-Mar-2007 is: 1

提交回复
热议问题