I've writing a date-time library, and need to implement the addition of a duration to a date-time.
If I add a 1 month duration:
P1M to the 31st March 2012:
2012-03-31, does the standard define what the result is?
Because the resulting date (31st April) does not exist, there are at least two options:
- Fall back to the last day of the resulting month. This is the approach currently taken by the ThreeTen API, the (alpha) reference implementation of JSR-310:
ZonedDateTime date = ZonedDateTime.parse("2012-03-31T00:00:00Z"); Period duration = Period.parse("P1M"); System.out.println(date.plus(duration).toString()); // 2012-04-30T00:00Z
- Carry the extra day to the next month. This is the approach taken by the DateTime class in PHP:
$date = new DateTime('2012-03-31T00:00:00Z'); $duration = new DateInterval('P1M'); echo $date->add($duration)->format('c'); // 2012-05-01T00:00:00+00:00
I'm surprised that two date-time libraries contradict on this point, so I'm wondering whether the standard defines the result of this operation?