# Year Error in Date Calculation

**URL:** <https://discourse.processing.org/t/year-error-in-date-calculation/19154>\
**Category:** Coding Questions\
**Created:** [March 29, 2020, 8:31pm UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154 "2020-03-29T20:31:58Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![RichardDL](https://avatars.discourse-cdn.com/v4/letter/r/f475e1/32.png) [@RichardDL](https://discourse.processing.org/u/RichardDL)\
**Post date:** [March 29, 2020, 8:31pm UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154/1 "2020-03-29T20:31:58Z")

</div>

I was printing dates along the x axis of a graph, and saw a year error. I’ve reduced the program to a minimum demo of the problem. It’s supposed to print the date for each day. The number of days in error varies from year to year. What’s going wrong?

Output:

> 25-Dec-2001  
> 26-Dec-2001  
> 27-Dec-2001  
> 28-Dec-2001  
> 29-Dec-2001  
> 30-Dec-2001  
> 31-Dec-2002 \<— 2002 ???  
> 01-Jan-2002  
> 02-Jan-2002  
> 03-Jan-2002  
> 04-Jan-2002  
> 05-Jan-2002

```auto
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

SimpleDateFormat date_fmt_date = new SimpleDateFormat("dd-MMM-YYYY");

Date addDays(Date date, int days)
{ // from internet somewhere
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  cal.add(Calendar.DATE, days); 
  return cal.getTime();
}

void list_dates()
{
  int ix;
  Date dDate;
  String sDate;
  
  dDate = new Date("25-Dec-2001");
  for (ix = 0; ix < 12; ix++)
  {
    sDate = date_fmt_date.format(dDate);
    print(sDate + " ");
    println();
    dDate = addDays(dDate, 1);
  } 
}

void setup()
{
  list_dates();
  exit();
}
void draw(){}

```

---

<div class="post-metadata">

**Author:** ![debxyz](https://avatars.discourse-cdn.com/v4/letter/d/58956e/32.png) [@debxyz](https://discourse.processing.org/u/debxyz)\
**Post date:** [March 29, 2020, 9:14pm UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154/2 "2020-03-29T21:14:45Z")

</div>

I wonder if the extra day for leap year is a factor?

---

<div class="post-metadata">

**Author:** ![RichardDL](https://avatars.discourse-cdn.com/v4/letter/r/f475e1/32.png) [@RichardDL](https://discourse.processing.org/u/RichardDL)\
**Post date:** [March 29, 2020, 10:06pm UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154/3 "2020-03-29T22:06:08Z")

</div>

I’ve modified the program to print a few days around each new year. The number of days in error varies with a sort of cycle over a few years. Could be 8 years +/- which would be leap-year \* 2.

```auto
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

SimpleDateFormat date_fmt_date = new SimpleDateFormat("dd-MMM-YYYY");

Date addDays(Date date, int days)
{
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  cal.add(Calendar.DATE, days); 
  return cal.getTime();
}

void list_dates()
{
  int ix;
  Date dDate;
  String sDate;
  int iYr;
  String sYear;
  
  for (iYr = 0; iYr < 22; iYr++)
  {
    sYear = String.format("20%02d", iYr);
    
    
    dDate = new Date("28-Dec-" + sYear);
    for (ix = 0; ix < 8; ix++)
    {
      sDate = date_fmt_date.format(dDate);
      print(String.format("%2d %2d ", iYr, ix));
      print(sDate + " ");
      println();
      dDate = addDays(dDate, 1);
    } 
    println();
  }
}

void setup()
{
  list_dates();
  exit();
}
void draw(){}

```

0 0 28-Dec-2000  
0 1 29-Dec-2000  
0 2 30-Dec-2000  
0 3 31-Dec-2000  
0 4 01-Jan-2001 Good  
0 5 02-Jan-2001  
0 6 03-Jan-2001  
0 7 04-Jan-2001

1 0 28-Dec-2001  
1 1 29-Dec-2001  
1 2 30-Dec-2001  
1 3 31-Dec-2002 X  
1 4 01-Jan-2002  
1 5 02-Jan-2002  
1 6 03-Jan-2002  
1 7 04-Jan-2002

2 0 28-Dec-2002  
2 1 29-Dec-2002  
2 2 30-Dec-2003 X  
2 3 31-Dec-2003 X  
2 4 01-Jan-2003  
2 5 02-Jan-2003  
2 6 03-Jan-2003  
2 7 04-Jan-2003

3 0 28-Dec-2003  
3 1 29-Dec-2004 X  
3 2 30-Dec-2004 X  
3 3 31-Dec-2004 X  
3 4 01-Jan-2004  
3 5 02-Jan-2004  
3 6 03-Jan-2004  
3 7 04-Jan-2004

4 0 28-Dec-2004  
4 1 29-Dec-2004  
4 2 30-Dec-2004  
4 3 31-Dec-2004  
4 4 01-Jan-2004 X  
4 5 02-Jan-2004 X  
4 6 03-Jan-2005  
4 7 04-Jan-2005

5 0 28-Dec-2005  
5 1 29-Dec-2005  
5 2 30-Dec-2005  
5 3 31-Dec-2005  
5 4 01-Jan-2005 X  
5 5 02-Jan-2006  
5 6 03-Jan-2006  
5 7 04-Jan-2006

6 0 28-Dec-2006  
6 1 29-Dec-2006  
6 2 30-Dec-2006  
6 3 31-Dec-2006  
6 4 01-Jan-2007 Good  
6 5 02-Jan-2007  
6 6 03-Jan-2007  
6 7 04-Jan-2007

7 0 28-Dec-2007  
7 1 29-Dec-2007  
7 2 30-Dec-2007  
7 3 31-Dec-2008 X  
7 4 01-Jan-2008  
7 5 02-Jan-2008  
7 6 03-Jan-2008  
7 7 04-Jan-2008

8 0 28-Dec-2008  
8 1 29-Dec-2009 X  
8 2 30-Dec-2009 X  
8 3 31-Dec-2009 X  
8 4 01-Jan-2009  
8 5 02-Jan-2009  
8 6 03-Jan-2009  
8 7 04-Jan-2009

9 0 28-Dec-2009  
9 1 29-Dec-2009  
9 2 30-Dec-2009  
9 3 31-Dec-2009  
9 4 01-Jan-2009 X  
9 5 02-Jan-2009 X  
9 6 03-Jan-2009 X  
9 7 04-Jan-2010

10 0 28-Dec-2010  
10 1 29-Dec-2010  
10 2 30-Dec-2010  
10 3 31-Dec-2010  
10 4 01-Jan-2010 X  
10 5 02-Jan-2010 X  
10 6 03-Jan-2011  
10 7 04-Jan-2011

11 0 28-Dec-2011  
11 1 29-Dec-2011  
11 2 30-Dec-2011  
11 3 31-Dec-2011  
11 4 01-Jan-2011 X  
11 5 02-Jan-2012  
11 6 03-Jan-2012  
11 7 04-Jan-2012

12 0 28-Dec-2012  
12 1 29-Dec-2012  
12 2 30-Dec-2012  
12 3 31-Dec-2013 X  
12 4 01-Jan-2013  
12 5 02-Jan-2013  
12 6 03-Jan-2013  
12 7 04-Jan-2013

13 0 28-Dec-2013  
13 1 29-Dec-2013  
13 2 30-Dec-2014 X  
13 3 31-Dec-2014 X  
13 4 01-Jan-2014  
13 5 02-Jan-2014  
13 6 03-Jan-2014  
13 7 04-Jan-2014

14 0 28-Dec-2014  
14 1 29-Dec-2015 X  
14 2 30-Dec-2015 X  
14 3 31-Dec-2015 X  
14 4 01-Jan-2015  
14 5 02-Jan-2015  
14 6 03-Jan-2015  
14 7 04-Jan-2015

15 0 28-Dec-2015  
15 1 29-Dec-2015  
15 2 30-Dec-2015  
15 3 31-Dec-2015  
15 4 01-Jan-2015 X  
15 5 02-Jan-2015 X  
15 6 03-Jan-2015 X  
15 7 04-Jan-2016

16 0 28-Dec-2016  
16 1 29-Dec-2016  
16 2 30-Dec-2016  
16 3 31-Dec-2016  
16 4 01-Jan-2016 X  
16 5 02-Jan-2017  
16 6 03-Jan-2017  
16 7 04-Jan-2017

17 0 28-Dec-2017  
17 1 29-Dec-2017  
17 2 30-Dec-2017  
17 3 31-Dec-2017  
17 4 01-Jan-2018 Good  
17 5 02-Jan-2018  
17 6 03-Jan-2018  
17 7 04-Jan-2018

18 0 28-Dec-2018  
18 1 29-Dec-2018  
18 2 30-Dec-2018  
18 3 31-Dec-2019 X  
18 4 01-Jan-2019  
18 5 02-Jan-2019  
18 6 03-Jan-2019  
18 7 04-Jan-2019

19 0 28-Dec-2019  
19 1 29-Dec-2019  
19 2 30-Dec-2020 X  
19 3 31-Dec-2020 X  
19 4 01-Jan-2020  
19 5 02-Jan-2020  
19 6 03-Jan-2020  
19 7 04-Jan-2020

20 0 28-Dec-2020  
20 1 29-Dec-2020  
20 2 30-Dec-2020  
20 3 31-Dec-2020  
20 4 01-Jan-2020 X  
20 5 02-Jan-2020 X  
20 6 03-Jan-2020 x  
20 7 04-Jan-2021

21 0 28-Dec-2021  
21 1 29-Dec-2021  
21 2 30-Dec-2021  
21 3 31-Dec-2021  
21 4 01-Jan-2021 X  
21 5 02-Jan-2021 X  
21 6 03-Jan-2022  
21 7 04-Jan-2022

```auto

```

---

<div class="post-metadata">

**Author:** ![glv](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/glv/32/18785_2.png) [@glv](https://discourse.processing.org/u/glv)\
**Post date:** [March 29, 2020, 11:14pm UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154/4 "2020-03-29T23:14:02Z")

</div>

Hello,

My quick look at this:

```auto
//SimpleDateFormat date_fmt_date = new SimpleDateFormat("dd-MMM-yyyy");
  
  for (iYr = 1990; iYr < 2022; iYr++)
    {
    sYear = str(iYr);
   
    dDate = new Date("28-Dec-" + sYear);
    for (ix = 0; ix < 8; ix++)
      {
      sDate = date_fmt_date.format(dDate);
      print(String.format("%2d %2d ", iYr, ix));
      print(sDate + " ");
      println();
      dDate = addDays(dDate, 1);
      } 
    println();
    }

```

I set the year explicitly and not by adding 20 to the counter.  
It seemed to work.

 ![image](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/8/808aa5b45f268e6c1173df2139d5295fe990a941.png)

I got some insight from here and changed the format and simplified it a bit:

> <https://stackoverflow.com/questions/22326339/how-create-date-object-with-values-in-java/22326675#22326675>

`:)`

---

<div class="post-metadata">

**Author:** ![RichardDL](https://avatars.discourse-cdn.com/v4/letter/r/f475e1/32.png) [@RichardDL](https://discourse.processing.org/u/RichardDL)\
**Post date:** [March 30, 2020, 8:47am UTC](https://discourse.processing.org/t/year-error-in-date-calculation/19154/5 "2020-03-30T08:47:34Z")

</div>

@glv Thanks for trying this. I knew the code for the year was crude, but that’s not the problem. Clearly it runs correctly on your PC, so what’s the difference? - yyyy is correct and YYYY is different. Explained here [YYYY vs yyyy](http://dangoldin.com/2019/01/06/javas-simpledateformat-yyyy-vs-yyyy/) . Thanks again.
