From 7d4802425e808ee51a54feac6010f13dd6e65384 Mon Sep 17 00:00:00 2001 From: Raimund Bauer Date: Tue, 27 Dec 2016 14:28:03 +0100 Subject: [PATCH] Avoid glitches around DST change by inverting utc logic --- strftime.js | 60 ++++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/strftime.js b/strftime.js index d34ad58..c487a17 100644 --- a/strftime.js +++ b/strftime.js @@ -166,7 +166,9 @@ if (_useUtcBasedDate) { // how to avoid duplication of date instantiation for utc here? // we tied to getTimezoneOffset of the current date - _cachedDate = new Date(_cachedDateTimestamp + getTimestampToUtcOffsetFor(_cachedDate) + _customTimezoneOffset); + //_cachedDate = new Date(_cachedDateTimestamp + getTimestampToUtcOffsetFor(_cachedDate) + _customTimezoneOffset); + } else { + _cachedDate = new Date(_cachedDateTimestamp - getTimestampToUtcOffsetFor(_cachedDate) - _customTimezoneOffset); } } else { @@ -178,7 +180,9 @@ timestamp = date.getTime(); if (_useUtcBasedDate) { - date = new Date(date.getTime() + getTimestampToUtcOffsetFor(date) + _customTimezoneOffset); + //date = new Date(date.getTime() + getTimestampToUtcOffsetFor(date) + _customTimezoneOffset); + } else { + date = new Date(date.getTime() - getTimestampToUtcOffsetFor(date) - _customTimezoneOffset); } } @@ -230,19 +234,19 @@ // 'Thursday' // case 'A': case 65: - resultString += locale.days[date.getDay()]; + resultString += locale.days[date.getUTCDay()]; break; // 'January' // case 'B': case 66: - resultString += locale.months[date.getMonth()]; + resultString += locale.months[date.getUTCMonth()]; break; // '19' // case 'C': case 67: - resultString += padTill2(Math.floor(date.getFullYear() / 100), padding); + resultString += padTill2(Math.floor(date.getUTCFullYear() / 100), padding); break; // '01/01/70' @@ -260,13 +264,13 @@ // '00' // case 'H': case 72: - resultString += padTill2(date.getHours(), padding); + resultString += padTill2(date.getUTCHours(), padding); break; // '12' // case 'I': case 73: - resultString += padTill2(hours12(date.getHours()), padding); + resultString += padTill2(hours12(date.getUTCHours()), padding); break; // '000' @@ -278,13 +282,13 @@ // '00' // case 'M': case 77: - resultString += padTill2(date.getMinutes(), padding); + resultString += padTill2(date.getUTCMinutes(), padding); break; // 'am' // case 'P': case 80: - resultString += date.getHours() < 12 ? locale.am : locale.pm; + resultString += date.getUTCHours() < 12 ? locale.am : locale.pm; break; // '00:00' @@ -296,7 +300,7 @@ // '00' // case 'S': case 83: - resultString += padTill2(date.getSeconds(), padding); + resultString += padTill2(date.getUTCSeconds(), padding); break; // '00:00:00' @@ -326,7 +330,7 @@ // '1970' // case 'Y': case 89: - resultString += date.getFullYear(); + resultString += date.getUTCFullYear(); break; // 'GMT' @@ -345,13 +349,13 @@ // 'Thu' // case 'a': case 97: - resultString += locale.shortDays[date.getDay()]; + resultString += locale.shortDays[date.getUTCDay()]; break; // 'Jan' // case 'b': case 98: - resultString += locale.shortMonths[date.getMonth()]; + resultString += locale.shortMonths[date.getUTCMonth()]; break; // '' @@ -363,25 +367,25 @@ // '01' // case 'd': case 100: - resultString += padTill2(date.getDate(), padding); + resultString += padTill2(date.getUTCDate(), padding); break; // ' 1' // case 'e': case 101: - resultString += padTill2(date.getDate(), padding == null ? ' ' : padding); + resultString += padTill2(date.getUTCDate(), padding == null ? ' ' : padding); break; // 'Jan' // case 'h': case 104: - resultString += locale.shortMonths[date.getMonth()]; + resultString += locale.shortMonths[date.getUTCMonth()]; break; // '000' // case 'j': case 106: - var y = new Date(date.getFullYear(), 0, 1); + var y = new Date(date.getUTCFullYear(), 0, 1); var day = Math.ceil((date.getTime() - y.getTime()) / (1000 * 60 * 60 * 24)); resultString += padTill3(day); break; @@ -389,19 +393,19 @@ // ' 0' // case 'k': case 107: - resultString += padTill2(date.getHours(), padding == null ? ' ' : padding); + resultString += padTill2(date.getUTCHours(), padding == null ? ' ' : padding); break; // '12' // case 'l': case 108: - resultString += padTill2(hours12(date.getHours()), padding == null ? ' ' : padding); + resultString += padTill2(hours12(date.getUTCHours()), padding == null ? ' ' : padding); break; // '01' // case 'm': case 109: - resultString += padTill2(date.getMonth() + 1, padding); + resultString += padTill2(date.getUTCMonth() + 1, padding); break; // '\n' @@ -413,13 +417,13 @@ // '1st' // case 'o': case 111: - resultString += String(date.getDate()) + ordinal(date.getDate()); + resultString += String(date.getUTCDate()) + ordinal(date.getUTCDate()); break; // 'AM' // case 'p': case 112: - resultString += date.getHours() < 12 ? locale.AM : locale.PM; + resultString += date.getUTCHours() < 12 ? locale.AM : locale.PM; break; // '12:00:00 AM' @@ -443,7 +447,7 @@ // '4' // case 'u': case 117: - var day = date.getDay(); + var day = date.getUTCDay(); resultString += day === 0 ? 7 : day; break; // 1 - 7, Monday is first day of the week @@ -456,7 +460,7 @@ // '4' // case 'w': case 119: - resultString += date.getDay(); + resultString += date.getUTCDay(); break; // 0 - 6, Sunday is first day of the week // '12/31/69' @@ -468,7 +472,7 @@ // '70' // case 'y': case 121: - resultString += ('' + date.getFullYear()).slice(2); + resultString += ('' + date.getUTCFullYear()).slice(2); break; // '+0000' @@ -591,7 +595,7 @@ // This works by shifting the weekday back by one day if we // are treating Monday as the first day of the week. - var weekday = date.getDay(); + var weekday = date.getUTCDay(); if (firstWeekday === 'monday') { if (weekday === 0) // Sunday weekday = 6; @@ -599,8 +603,8 @@ weekday--; } - var firstDayOfYearUtc = Date.UTC(date.getFullYear(), 0, 1), - dateUtc = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()), + var firstDayOfYearUtc = Date.UTC(date.getUTCFullYear(), 0, 1), + dateUtc = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()), yday = Math.floor((dateUtc - firstDayOfYearUtc) / 86400000), weekNum = (yday + 7 - weekday) / 7;