【问题标题】:Get current timestamp from specific date using UTC/GMT+0 as epoch ignoring local time zone epoch使用 UTC/GMT+0 作为纪元从特定日期获取当前时间戳,忽略本地时区纪元
【发布时间】:2019-04-15 19:35:42
【问题描述】:

我从这个社区尝试了很多,但似乎没有针对我的案例的超具体场景。

所以基本上我有一个yyyy-mm-dd 格式的字符串。我使用日期方法来调整它并在日期上添加时间以使其更具体。我想将其转换为时间戳,同时忽略客户端计算机的当前时区(或使用 UTC 时区)。

我有这个代码:

function getTimestampRange(sparams, eparams){

sparams = "2018-11-12", eparams = "2018-11-13"; //sample param values

const start = sparams.split("-");
const end = eparams.split("-");

const startDate = new Date(start[0], start[1] - 1, start[2]);
const endDate = new Date(end[0], end[1] - 1, end[2]);
endDate.setHours(23);
endDate.setMinutes(59);
endDate.setSeconds(59);

//startDate is 2018-11-12 00:00:00 and endDate is 2018-11-13 23:59:59

const startTS = startDate.getTime() / 1000;
const endTS = endDate.getTime() / 1000;

return [startTS, endTS]
}

这一切都很好,但问题是,我正在获取相对于我的计算机时区的时间戳。 (格林威治标准时间+9)。所以我的时代是 1970-01-01 的第 9 个小时。这不是我需要的。我需要 GMT+0 UTC 时间戳。

在这种情况下,我会得到 15419484001542121199,分别是 start 和 end;我应该在哪里得到15419808001542153599

薅羊毛

【问题讨论】:

  • " 我想将其转换为时间戳,同时忽略客户端计算机的当前时区" ????时间戳与时区无关。它们反映了自 1970-01-01T00:00:00Z 以来的秒数(或毫秒数)
  • @Phil 我不知道如何正确表达它,但我在这个方法上得到了不同的时间戳,这是一个非常简单的算法。当我转换我在这种方法中得到的时间戳时,它总是比 UTC 早 9 小时

标签: javascript date timestamp epoch


【解决方案1】:

这里有两个选择...

  1. 使用Date.UTC 构造UTC 时间戳

    const startDate = Date.UTC(start[0], start[1] - 1, start[2]) // a timestamp
    const endDate = Date.UTC(end[0], end[1] - 1, end[2], 23, 59, 59) // a timestamp
    

    注意Date.UTC() 生成以毫秒为单位的时间戳,而不是 Date 实例。由于您可以按上述方式设置小时、分钟和秒,因此您不再需要操作它们。

  2. 使用遵循ISO 8601 standard 的现有日期字符串作为Date 构造函数的唯一参数。

    这得益于this particular nuance...

    对 ISO 8601 格式的支持的不同之处在于仅日期字符串(例如“1970-01-01”)被视为 UTC,而不是本地。

    const startDate = new Date(sparams)
    const endDate = new Date(eparams)
    

    Parsing ISO 8601 应该在所有像样的浏览器和 IE v9 中都支持。由于这依赖于特定的“功能”,该“功能”可能会或可能不会在客户端中实现,因此此方法存在风险。


对于您的结束日期,如果进行解析,您可以轻松地将时间和区域部分附加到日期字符串,而不是使用小时、分钟和秒值来操作日期对象。例如

const endDate = new Date(`${eparams}T23:59:59Z`)

或者,使用Date.prototype.setUTCHours()...

const endDate = new Date(eparams)
endDate.setUTCHours(23, 59, 59)

【讨论】:

  • @AbanaClara 来自内存,ISO 8601 格式的字符串在 IE 中工作正常
  • 我会非常犹豫是否推荐使用内置解析器。手动解析 ISO 日期是 2 行代码(或者如果你想变得时髦,则为 1 行),为此你可以获得确定性与可能......也许不是......
  • @RobG 你的意思是你不信任new Date(someISO8601DateString)?我当然被 IE 和非 ISO 字符串烧毁了,但是当字符串格式正确时从未遇到过问题
  • @Phil — 不在设备可以是任何东西的一般 Web 应用程序中。我只是认为降低风险是微不足道的。此外,将 YYYY-MM-DD 解析为 UTC 经常会造成混淆,而 parseAsLocal()parseAsUTC 会使事情变得更清晰。 ;-)
  • @RobG 这是一个非常公平的决定。很高兴我把这两个例子都放进去了?
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 2017-07-21
  • 2021-12-31
  • 2020-02-21
  • 2021-03-25
  • 2020-05-19
  • 2011-06-05
相关资源
最近更新 更多