# 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

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

• 填满一个月份时，要增加月份数值，然后要检查是否进入下一年，这个类似于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));
}
}
``````

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

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

// This code is contributed by mits
``````

## Reference

Date after adding given number of days to the given date

Find number of days between two given dates