From ac3817682873a60fcec1db005b675c7f555edb88 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Mon, 28 Jun 2021 18:40:44 -0700 Subject: [PATCH] Fixed power state time localization, #2817 --- views/default.handlebars | 7 ++++++- webserver.js | 26 +++++++++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/views/default.handlebars b/views/default.handlebars index f68af528..bdf6dda1 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -1394,6 +1394,7 @@ mql.addEventListener('change', function() { console.log('Dark Change'); }); */ + function startup() { if ((features & 32) == 0) { // Guard against other site's top frames (web bugs). @@ -7244,7 +7245,10 @@ ++count; date = new Date(date.getTime() - (1000 * 60 * 60 * 24)); // Substract one day } - QH('p10html2', '' + x + '
' + "Day" + '' + "7 Day Power State" + '
'); + // Add the language and timezone of the browser to the server so the server can localize the time correctly. + var tz = ''; + try { tz = '&tz=' + encodeURIComponentEx(Intl.DateTimeFormat().resolvedOptions().timeZone); } catch (ex) {} + QH('p10html2', '' + x + '
' + "Day" + '' + "7 Day Power State" + '
'); } // Return a color for the given power state @@ -15640,6 +15644,7 @@ return new Blob([bytes2], { type: 'application/octet-stream' }) // application/json;charset=utf-8 } + function getLang() { if (navigator.languages != undefined) { return navigator.languages[0]; } return navigator.language; } function getNodeAmtVersion(node) { if ((node == null) || (node.intelamt == null) || (typeof node.intelamt.ver != 'string')) return 0; var verSplit = node.intelamt.ver.split('.'); if (verSplit.length < 2) return 0; return parseInt(verSplit[0]) + (parseInt(verSplit[1]) / 100); } function getstore(name, val) { try { if (typeof (localStorage) === 'undefined') return val; var v = localStorage.getItem(name); if ((v == null) || (v == null)) return val; return v; } catch (e) { return val; } } function addLink(x, f) { return '' + x + ' '; } diff --git a/webserver.js b/webserver.js index c362313f..e9c4e23e 100644 --- a/webserver.js +++ b/webserver.js @@ -5208,10 +5208,17 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { // Check if we have right to this node if (obj.GetNodeRights(user, node.meshid, node._id) == 0) { res.sendStatus(401); return; } - // Get local time offset + // See how we will convert UTC time to local time var localTimeOffset = 0; - if (req.query.tf != null) { localTimeOffset = parseInt(req.query.tf) } - if (isNaN(localTimeOffset)) { localTimeOffset = 0; } + var timeConversionSystem = 0; + if ((req.query.l != null) && (req.query.tz != null)) { + timeConversionSystem = 1; + } else if (req.query.tf != null) { + // Get local time offset (bad way) + timeConversionSystem = 2; + localTimeOffset = parseInt(req.query.tf); + if (isNaN(localTimeOffset)) { localTimeOffset = 0; } + } // Get the list of power events and send them setContentDispositionHeader(res, 'application/octet-stream', 'powerevents.csv', null, 'powerevents.csv'); @@ -5220,12 +5227,17 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { for (var i in docs) { if (docs[i].power != prevState) { prevState = docs[i].power; - var localTime = new Date(docs[i].time.getTime() + (localTimeOffset * 60000)).toISOString(); - localTime = localTime.substring(0, localTime.length - 1); + var localTime = ''; + if (timeConversionSystem == 1) { // Good way + localTime = new Date(docs[i].time.getTime()).toLocaleString(req.query.l, { timeZone: req.query.tz }) + } else if (timeConversionSystem == 2) { // Bad way + localTime = new Date(docs[i].time.getTime() + (localTimeOffset * 60000)).toISOString(); + localTime = localTime.substring(0, localTime.length - 1); + } if (docs[i].oldPower != null) { - xevents.push(docs[i].time.toISOString() + ',' + localTime + ',' + docs[i].power + ',' + docs[i].oldPower); + xevents.push('\"' + docs[i].time.toISOString() + '\",\"' + localTime + '\",' + docs[i].power + ',' + docs[i].oldPower); } else { - xevents.push(docs[i].time.toISOString() + ',' + localTime + ',' + docs[i].power); + xevents.push('\"' + docs[i].time.toISOString() + '\",\"' + localTime + '\",' + docs[i].power); } } }