我在这个社区尝试了很多,但似乎没有针对我的案例的超特定场景。
所以基本上我有一个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时间戳。
在这个场景中,我会得到1541948400
和1542121199
,分别开始和结束;在那里我应该得到1541980800
和1542153599
。
kudasai
这里有两个选项。。。
-
使用
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
实例。由于您可以如上所述设置小时、分钟和秒,因此不再需要操纵这些时间。 -
使用符合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)