From c14e1712ea7e42bdb7b2d246a9fcad3ca81aa048 Mon Sep 17 00:00:00 2001 From: Ivan Trusov Date: Fri, 13 May 2022 11:00:36 +0300 Subject: [PATCH 1/2] Fix basedate calculation Correct numdate / datenum calculation to eliminate problems with timezones that equal nowadays but were different in the past (e.g. Europe/Minsk and Europe/Moscow) --- xlsx.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xlsx.js b/xlsx.js index 5cc5758..45b1a0e 100644 --- a/xlsx.js +++ b/xlsx.js @@ -3214,16 +3214,19 @@ function evert_arr(obj) { return o; } -var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 +var basedate = new Date(); // 2209161600000 +basedate.setUTCFullYear(1899, 11, 30); +basedate.setUTCHours(0, 0, 0); + function datenum(v, date1904) { var epoch = v.getTime(); if(date1904) epoch -= 1462*24*60*60*1000; - var dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; + var dnthresh = basedate.getTime() + v.getTimezoneOffset() * 60000; return (epoch - dnthresh) / (24 * 60 * 60 * 1000); } var refdate = new Date(); -var dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; var refoffset = refdate.getTimezoneOffset(); +var dnthresh = basedate.getTime() + refoffset * 60000; function numdate(v) { var out = new Date(); out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh); From 1dfabe74b1403d2dc48729103afb2b9dd2df28fd Mon Sep 17 00:00:00 2001 From: Ivan Trusov Date: Tue, 31 May 2022 17:26:54 +0300 Subject: [PATCH 2/2] Fix basedate calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Philippe Rivière --- xlsx.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/xlsx.js b/xlsx.js index 45b1a0e..c83e754 100644 --- a/xlsx.js +++ b/xlsx.js @@ -3214,9 +3214,7 @@ function evert_arr(obj) { return o; } -var basedate = new Date(); // 2209161600000 -basedate.setUTCFullYear(1899, 11, 30); -basedate.setUTCHours(0, 0, 0); +var basedate = new Date(Date.UTC(1899, 11, 30, 0, 0, 0)); // 2209161600000 function datenum(v, date1904) { var epoch = v.getTime();