[Tickets #13947] Re: Calendar breaks on DST start date
noreply at bugs.horde.org
noreply at bugs.horde.org
Tue Nov 14 00:24:02 UTC 2017
DO NOT REPLY TO THIS MESSAGE. THIS EMAIL ADDRESS IS NOT MONITORED.
Ticket URL: https://bugs.horde.org/ticket/13947
------------------------------------------------------------------------------
Ticket | 13947
Updated By | lfbm.andamentos at gmail.com
Summary | Calendar breaks on DST start date
Queue | Kronolith
Version | 4.2.2
Type | Bug
State | Feedback
Priority | 1. Low
Milestone |
Patch |
Owners |
------------------------------------------------------------------------------
lfbm.andamentos at gmail.com (2017-11-14 00:24) wrote:
Although latest Datejs release is 10 years old and probably should not
be used anymore, this is not a bug with it. Nor it's a bug with Horde.
ECMAScript does not have specs regarding what happens when a local
time is set to an invalid moment. So each browser deals with it on its
own way.
In 2017, Brazil shifts to DST at 2017-10-14, precisely at the end of
23:59. So just before the clock turns to 00:00, it jumps do
2017-10-15, 01:00. So it creates a gap of missing local time.
Other countries do the same thing at 23:59 (Lebanon, Syria) and
others, such as US, do it at 02:00, when it jumps to 03:00, and others
do it at different moments. Every country that has DST will have gaps
of missing local times. The site www.timeanddate.com is the best
reference there is.
So when you try to create a date at an invalid moment in local time
with Chrome, for example, it will jump to the next day:
new Date(2017, 9, 15, 0, 0).toString();
?Sun Oct 15 2017 01:00:00 GMT-0200 (-02)?
Here, I set my computer to Brazil standard time and tried to ask
Chrome what is the local time in 2017-10-15 (9 is October because the
counter starts with 0), at midnight (00:00). Since midnight does not
exist on 2017-10-15, Chrome has jumped to 2017-10-15 01:00 and gave me
that answer.
If I do the same thing with Firefox, it jumps back to the day before:
new Date(2017, 9, 15, 0, 0).toString();
"Sat Oct 14 2017 23:00:00 GMT-0300"
So in various parts of kronolith.js, when it tries to create moments
at invalid local times, things get broken depending on the user's
browser and moment in time. This is also the reason why adding one day
to 2017-10-14 00:00 will return a result of 2017-10-14 23:00, instead
of 2017-10-15 00:00, when the user is on Firefox.
This is causing the day 2017-10-14 to appear duplicated in kronolith
dynamic view, as reported in the original post.
The Horde Calendar Picker will also not let you select the day
2017-10-15, because, such as Datejs, it always defaults new date
objects to midnight (00:00) and, as seen above, the moment 2017-10-15
00:00 simply does not exist in some local times. So when you select
2017-10-15 it returns 2017-10-14, if your computer is set to any date
before entering Brazil (and similar countries) DST.
This is why when a JS program is interested only in dates (not time)
and date calculations, it should *never* trust local time. It should
always use UTC time, because there are no gaps nor overlaps in UTC.
Another way of working around this issue is to default date creations
to 12:00, because no DST transitions ever occur in the middle of the
day, in any time zone. So it?s a safer way of doing date calculations
when the choice of trusting local times had already been made in the
first place.
Unfortunately, Datejs is old and abandoned and does not have full UTC support.
Moment.js (https://momentjs.com/) is a much better choice and updated
library. It also has a nice feature which is the UTC mode. While in
UTC mode, all display methods will display in UTC time instead of
local time. Additionally, while in UTC mode, all getters and setters
will internally use the Date#getUTC and Date#setUTC methods instead of
the Date#get and Date#set methods
(https://momentjs.com/docs/#/parsing/utc/). This way you won?t have to
trust local time when dealing with date calculations.
The best solution here, IMHO, would be to rewrite the parts of
kronolith the uses Datejs and make it use moment.js, activating the
UTC mode when necessary.
It should be possible to patch kronolith.js in order to make it create
dates at 12:00 (midday), when time does not matter, instead of
midnight. But the first solution (moment.js with UTC mode) seems more
elegant.
Anyway, this is definitely something that cannot be ignored by horde,
because different browser deals with invalid local times in different
manners and it does not seem to change in a near future.
More information about the bugs
mailing list