You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Thomas Neidhart (Commented) (JIRA)" <ji...@apache.org> on 2012/04/03 14:14:25 UTC

[jira] [Commented] (LANG-796) DateUtils.addDays does not work properly with daylight saving time (DST)

    [ https://issues.apache.org/jira/browse/LANG-796?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13245250#comment-13245250 ] 

Thomas Neidhart commented on LANG-796:
--------------------------------------

I was still musing about this issue, and maybe adding an additional version with a TimeZone parameter could make sense:

{noformat}
public static Date add(Date date, int calendarField, int amount, TimeZone tz) {
     Calendar cal = Calendar.getInstance(tz);
     cal.setTime(date);
     cal.add(calendarField, amount);
     return cal.getTime();
}
{noformat}

But to be consistent, this should be done for all methods (e.g. addDays, addMonths, ..), and would definitely bloat the API.
                
> DateUtils.addDays does not work properly with daylight saving time (DST)
> ------------------------------------------------------------------------
>
>                 Key: LANG-796
>                 URL: https://issues.apache.org/jira/browse/LANG-796
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.time.*
>    Affects Versions: 2.6
>            Reporter: Nicola Barbiero
>
> DateUtils.addDays does not work properly with daylight saving time.
> The signature of the method is 
>       Date addDays(Date date, int amount)
> and the javadocs says "Adds a number of days to a date returning a new object. The original date object is unchanged",
> so if X=date.getTime() is the number of milliseconds of the date in input,
> the expected behaviour is that the returned Date has a number of milliseconds equal to X+amount*(86400000), where 86400000 is the number of milliseconds in one day.
> But when the calculation goes across the DST change date, the number of milliseconds added does not correspond to whole days.
> For example, here in Brussels, this code fragment:
>    Date input = DateUtils.parseDateStrictly("25-03-2012_00:00", new String[] { "dd-MM-yyyy_HH:mm" });
>    Date output = DateUtils.addDays(input, 1);
> will give:
> 'input' equals to "Sun Mar 25 00:00:00 CET 2012"    ==> input.getTime() equals to 1332630000000
> 'output' equals to "Mon Mar 26 00:00:00 CEST 2012"  ==> output.getTime() equals to 1332712800000
> where 1332712800000-1332630000000=82800000 < 86400000
> (in fact 82800000 is equivalent to 23h).
> Since addDays is working with objects Date, it should not be influenced by events like the DST.
> Proposed solution: replace the current implementation
> public static Date add(Date date, int calendarField, int amount) {
>         if (date == null) {
>             throw new IllegalArgumentException("The date must not be null");
>         }
>         Calendar c = Calendar.getInstance();
>         c.setTime(date);
>         c.add(calendarField, amount);
>         return c.getTime();
>     }
> based on Calendar with an implementation that works only with Date objects, for example:
> public static Date add(Date date, int calendarField, int amount) {
>         if (date == null) {
>             throw new IllegalArgumentException("The date must not be null");
>         }
>         return new Date(input.getTime() + amount * 86400000l);
>     }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira