commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Adrian Crum (Commented) (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LANG-796) DateUtils.addDays does not work properly with daylight saving time (DST)
Date Tue, 27 Mar 2012 16:32:28 GMT

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

Adrian Crum commented on LANG-796:
----------------------------------

If you want to perform millisecond arithmetic, then I recommend you use long values and avoid
using the DateUtils class.

The JavaDocs seem clear to me - the method adds a day, not 86400000 milliseconds.

                
> 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

        

Mime
View raw message