Add N Days to Given Date

Houzz , String

date as string yyyyMMdd
positive integer 'n' delta in days
add n days to the date and return the correct date.

date assume it's valid
n could be arbitary big number
return date in String yyyyMMdd

Example

Input: 20190212, 2
Output: 20190214

Solution & Analysis

题目不难,输入是一个字符串代表一个日期”YYYYMMDD”,以及一个整数n代表天数,输出是n天之后的日期,返回“YYYYMMDD”的格式。

但是细节上要注意:

  • 月份需要查表,然后看是否有剩余天数,然后进入下一个循环检查是否能填满,以此类推

  • 填满一个月份时,要增加月份数值,然后要检查是否进入下一年,这个类似于12进制 year += month / 12; month = month % 12;

  • 此外还要注意的是闰年二月天数的处理,要根据当前year来决定:四年一闰,百年不闰,四百年又闰 (闰年:leap year)

public class Main {

  public static String getDate(String date, int n) {
    // date is YYYYMMDD format
    int[] daysInMonth = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int year;
    int month;
    int day;

    year = Integer.parseInt(date.substring(0,4));
    month = Integer.parseInt(date.substring(4,6));
    day = Integer.parseInt(date.substring(6,8));

    int d = day;

    while (n > 0) {
      // determin whether to add 1 in Feb
      if (month == 2) {
        daysInMonth[month - 1] = getFebDays(year);
      }
      if (n - (daysInMonth[month - 1] - d) > 0) {
        // filling current month
        n -= daysInMonth[month - 1] - d;
        d = 0;
        month++;
        if (month > 12) {
          year += month / 12;
          month = month % 12;
        } 
      } else if (d == 0) {
          day = n;
          break;
      } else {
        day += n;
        break;
      }
    }

    return "" + year + formatDayOrMonth(month) + formatDayOrMonth(day);

  }

  public static String formatDayOrMonth(int d) {
    if (d < 10) {
      return "0" + d;
    }
    return "" + d;
  }

  public static int getFebDays(int year) {
    // return 28 or 29 depending on whether it's leap year
      if (year % 100 != 0 && year % 4 == 0 && year % 400 == 0) {
          return 29;
      }
      return 28;
  }

  public static void main(String[] args) {
      String date = "20190212";
      int n = 365;
      System.out.println(getDate(date, n));
      n = 10;
      System.out.println(getDate(date, n));
      n = 100;
      System.out.println(getDate(date, n));
      n = 0;
      System.out.println(getDate(date, n));
  }
}

GeeksforGeeks的做法:https://www.geeksforgeeks.org/date-after-adding-given-number-of-days-to-the-given-date/

1) Let given date be d1, m1 and y1. Find offset (number of days spent from beginning to given date) of given year (Refer offsetDays() below)

2) Let offset found in above step be offset1. Find result year y2 and offset of result year offset2 (Refer highlighted code below)

3) Find days and months from offset2 and y2. (Refer revoffsetDays() below).

先找到given date在给定年份的天数offset;再定位结果年份和在结果年份天数的offset;最后订位结果月份和日期

// Java program to find date after adding 
// given number of days. 

class GFG 
{ 

    // Find values of day and month from 
    // offset of result year. 
    static int m2, d2; 

    // Return if year is leap year or not. 
    static boolean isLeap(int y) 
    { 
        if (y % 100 != 0 && y % 4 == 0 || y % 400 == 0) 
            return true; 

        return false; 
    } 

    // Given a date, returns number of days elapsed 
    // from the beginning of the current year (1st 
    // jan). 
    static int offsetDays(int d, int m, int y) 
    { 
        int offset = d; 

        if(m - 1 == 11) 
            offset += 335; 
        if(m - 1 == 10) 
            offset += 304; 
        if(m - 1 == 9) 
            offset += 273; 
        if(m - 1 == 8) 
            offset += 243; 
        if(m - 1 == 7) 
            offset += 212; 
        if(m - 1 == 6) 
            offset += 181; 
        if(m - 1 == 5) 
            offset += 151; 
        if(m - 1 == 4) 
            offset += 120; 
        if(m - 1 == 3) 
            offset += 90; 
        if(m - 1 == 2) 
            offset += 59; 
        if(m - 1 == 1) 
            offset += 31; 

        if (isLeap(y) && m > 2) 
            offset += 1; 

        return offset; 
    } 

    // Given a year and days elapsed in it, finds 
    // date by storing results in d and m. 
    static void revoffsetDays(int offset, int y) 
    { 
        int []month={ 0, 31, 28, 31, 30, 31, 30, 
                        31, 31, 30, 31, 30, 31 }; 

        if (isLeap(y)) 
            month[2] = 29; 

        int i; 
        for (i = 1; i <= 12; i++) 
        { 
            if (offset <= month[i]) 
                break; 
            offset = offset - month[i]; 
        } 

        d2 = offset; 
        m2 = i; 
    } 

    // Add x days to the given date. 
    static void addDays(int d1, int m1, int y1, int x) 
    { 
        int offset1 = offsetDays(d1, m1, y1); 
        int remDays = isLeap(y1) ? (366 - offset1) : (365 - offset1); 

        // y2 is going to store result year and 
        // offset2 is going to store offset days 
        // in result year. 
        int y2, offset2 = 0; 
        if (x <= remDays) 
        { 
            y2 = y1; 
            offset2 += x; 
        } 

        else
        { 
            // x may store thousands of days. 
            // We find correct year and offset 
            // in the year. 
            x -= remDays; 
            y2 = y1 + 1; 
            int y2days = isLeap(y2) ? 366 : 365; 
            while (x >= y2days) 
            { 
                x -= y2days; 
                y2++; 
                y2days = isLeap(y2) ? 366 : 365; 
            } 
            offset2 = x; 
        } 
        revoffsetDays(offset2, y2); 
        System.out.println("d2 = " + d2 + ", m2 = " + 
                                m2 + ", y2 = " + y2); 
    } 

    // Driven Program 
    public static void main(String[] args) 
    { 
        int d = 14, m = 3, y = 2015; 
        int x = 366; 
        addDays(d, m, y, x); 
    } 
} 

// This code is contributed by mits

Reference

类似问题from GeeksforGeeks:

Date after adding given number of days to the given date

Find number of days between two given dates

Last updated