diff --git a/src/popup/index.html b/src/popup/index.html index 86d91d4..89e36b7 100644 --- a/src/popup/index.html +++ b/src/popup/index.html @@ -924,6 +924,12 @@ /> gwei +
diff --git a/src/popup/views/addressDetail.js b/src/popup/views/addressDetail.js index 0e222cb..3ef4951 100644 --- a/src/popup/views/addressDetail.js +++ b/src/popup/views/addressDetail.js @@ -95,18 +95,39 @@ function show() { function isoDate(timestamp) { const d = new Date(timestamp * 1000); const pad = (n) => String(n).padStart(2, "0"); + if (state.utcTimestamps) { + return ( + d.getUTCFullYear() + + "-" + + pad(d.getUTCMonth() + 1) + + "-" + + pad(d.getUTCDate()) + + "T" + + pad(d.getUTCHours()) + + ":" + + pad(d.getUTCMinutes()) + + ":" + + pad(d.getUTCSeconds()) + + "Z" + ); + } + const offsetMin = -d.getTimezoneOffset(); + const sign = offsetMin >= 0 ? "+" : "-"; + const absOff = Math.abs(offsetMin); + const tzStr = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60); return ( d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()) + - " " + + "T" + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + - pad(d.getSeconds()) + pad(d.getSeconds()) + + tzStr ); } diff --git a/src/popup/views/addressToken.js b/src/popup/views/addressToken.js index b0e926b..78b03c9 100644 --- a/src/popup/views/addressToken.js +++ b/src/popup/views/addressToken.js @@ -48,18 +48,39 @@ function etherscanAddressLink(address) { function isoDate(timestamp) { const d = new Date(timestamp * 1000); const pad = (n) => String(n).padStart(2, "0"); + if (state.utcTimestamps) { + return ( + d.getUTCFullYear() + + "-" + + pad(d.getUTCMonth() + 1) + + "-" + + pad(d.getUTCDate()) + + "T" + + pad(d.getUTCHours()) + + ":" + + pad(d.getUTCMinutes()) + + ":" + + pad(d.getUTCSeconds()) + + "Z" + ); + } + const offsetMin = -d.getTimezoneOffset(); + const sign = offsetMin >= 0 ? "+" : "-"; + const absOff = Math.abs(offsetMin); + const tzStr = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60); return ( d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()) + - " " + + "T" + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + - pad(d.getSeconds()) + pad(d.getSeconds()) + + tzStr ); } diff --git a/src/popup/views/helpers.js b/src/popup/views/helpers.js index 1ad8ae0..450c98e 100644 --- a/src/popup/views/helpers.js +++ b/src/popup/views/helpers.js @@ -228,18 +228,39 @@ function formatAddressHtml(address, ensName, maxLen, title) { function isoDate(timestamp) { const d = new Date(timestamp * 1000); const pad = (n) => String(n).padStart(2, "0"); + if (state.utcTimestamps) { + return ( + d.getUTCFullYear() + + "-" + + pad(d.getUTCMonth() + 1) + + "-" + + pad(d.getUTCDate()) + + "T" + + pad(d.getUTCHours()) + + ":" + + pad(d.getUTCMinutes()) + + ":" + + pad(d.getUTCSeconds()) + + "Z" + ); + } + const offsetMin = -d.getTimezoneOffset(); + const sign = offsetMin >= 0 ? "+" : "-"; + const absOff = Math.abs(offsetMin); + const tzStr = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60); return ( d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()) + - " " + + "T" + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + - pad(d.getSeconds()) + pad(d.getSeconds()) + + tzStr ); } diff --git a/src/popup/views/settings.js b/src/popup/views/settings.js index b1b91b8..9263c46 100644 --- a/src/popup/views/settings.js +++ b/src/popup/views/settings.js @@ -249,6 +249,12 @@ function init(ctx) { } }); + $("settings-utc-timestamps").checked = state.utcTimestamps; + $("settings-utc-timestamps").addEventListener("change", async () => { + state.utcTimestamps = $("settings-utc-timestamps").checked; + await saveState(); + }); + $("btn-main-add-wallet").addEventListener("click", ctx.showAddWalletView); $("btn-settings-add-token").addEventListener( diff --git a/src/shared/state.js b/src/shared/state.js index 0331439..307a339 100644 --- a/src/shared/state.js +++ b/src/shared/state.js @@ -23,6 +23,7 @@ const DEFAULT_STATE = { hideFraudContracts: true, hideDustTransactions: true, dustThresholdGwei: 100000, + utcTimestamps: false, fraudContracts: [], tokenHolderCache: {}, theme: "system", @@ -54,6 +55,7 @@ async function saveState() { hideFraudContracts: state.hideFraudContracts, hideDustTransactions: state.hideDustTransactions, dustThresholdGwei: state.dustThresholdGwei, + utcTimestamps: state.utcTimestamps, fraudContracts: state.fraudContracts, tokenHolderCache: state.tokenHolderCache, theme: state.theme, @@ -110,6 +112,8 @@ async function loadState() { saved.dustThresholdGwei !== undefined ? saved.dustThresholdGwei : 100000; + state.utcTimestamps = + saved.utcTimestamps !== undefined ? saved.utcTimestamps : false; state.fraudContracts = saved.fraudContracts || []; state.tokenHolderCache = saved.tokenHolderCache || {}; state.theme = saved.theme || "system";