commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Duncan Jones (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (LANG-796) DateUtils.addDays does not work properly with daylight saving time (DST)
Date Fri, 26 Sep 2014 11:23:34 GMT

     [ https://issues.apache.org/jira/browse/LANG-796?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Duncan Jones updated LANG-796:
------------------------------
    Affects Version/s:     (was: 2.6)
                       3.3.2
        Fix Version/s:     (was: Patch Needed)
                       Discussion

I've just updated the Javadoc to provide a warning in the opening paragraphs:

{quote}
Several methods are provided for adding to {{Date}} objects, of the form 
{{addXXX(Date date, int amount)}}. It is important to note these methods 
use a {{Calendar}} internally (with default timezone and locale) and may
be affected by changes to daylight saving time (DST).
{quote}

We should discuss whether this behaviour should change in a future release. I've updated the
affected version to the latest, since this is still an issue.

SVN log:

Author: djones
Date: Fri Sep 26 11:19:32 2014
New Revision: 1627753

URL: http://svn.apache.org/r1627753
Log:
Added Javadoc warnings related to LANG-796.

Modified:
    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/DateUtils.java

> 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: 3.3.2
>            Reporter: Nicola Barbiero
>             Fix For: Discussion
>
>
> {{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:
> bq. 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:
> {code:java}
> Date input = DateUtils.parseDateStrictly("25-03-2012_00:00", new String[] { "dd-MM-yyyy_HH:mm"
});
> Date output = DateUtils.addDays(input, 1);
> {code}
> 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
> {code:java}
> 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();
>     }
> {code}
> based on Calendar with an implementation that works only with Date objects, for example:
> {code:java}
> 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);
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message