使用UTC/GMT+0作为epoch获取特定日期的当前时间戳,忽略本地时区epoch



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

所以基本上我有一个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]
}

这一切都很好,但问题是,我得到的是相对于我电脑时区的时间戳。(GMT+9(。所以我的时代是1970-01-01年的第9个小时。这不是我需要的。我需要GMT+0 UTC时间戳。

在这个场景中,我会得到15419484001542121199,分别开始和结束;在那里我应该得到15419808001542153599

kudasai

这里有两个选项。。。

  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标准的现有日期字符串作为Date构造函数的唯一参数。

    这得益于这种特殊的细微差别。。。

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

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

    从v9开始,所有不错的浏览器和IE都支持解析ISO8601。由于这依赖于一个特定的"功能">,该功能可能在客户端中实现,也可能不在客户端中实施,因此该方法存在风险因素。


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

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

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

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

最新更新