背景:
我正在做一个健身应用程序。因此,我从fit-bit API获得更新,包括日期、时间和当时的心率,格式如下:
date = "2021-02-01"
time = "14:15:00"
bpm: 78
现在,我需要将其转换为时间戳,并将心率保存为=>(时间戳:心率)我根据时间从应用程序中查询心率数据,所以它们必须匹配。
问题:我正在使用moment.js解析给定的数据,以获得时间戳
let date = "2021-02-01"
let time = "14:15:00"
let t = moment(`${date} ${time}`, 'yyyy-mm-dd hh:mm:ss').valueOf();
console.log("Timestamp", t, new Date(t).toUTCString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>
对于上面的代码,我得到了不同的值:
在数据库更新的后端服务器上:
"Timestamp", 1609510500000 Fri, 01 Jan 2021 14:15:00 GMT Fri,
正如你所看到的,它映射到1月1日,请帮助
在不同的系统上获得不同结果的原因是,YYYY-MM-DD hh:MM格式的时间戳(即没有时区偏移量)将被视为本地时间戳,因此在解析它时将使用主机系统的偏移量,从而从中生成UTC时间值。这意味着在时区偏移量不同的系统中,它代表不同的时刻。
如果您想向服务器发送UTC时间值,请创建一个有效的ECMAScript时间戳(ISO 8601的版本),将其解析为Date,然后获取其时间值,例如
let date = "2021-02-01";
let time = "14:15:00";
let d = new Date(`${date}T${time}`); // Parse as local
let timeValue = d.getTime();
console.log(
'Local: ' + d.toString() +
'nUTC : ' + d.toISOString() +
'nTime value: ' + timeValue
);
查看为什么Date.parse给出错误的结果也很有用
如果您一开始就有UTC值,您可以用适当的年、月、日等值调用Date.UTC,以获得直接用作时间戳的时间值(记住,月份是零索引的,所以从日历月份号中减去1,例如Jan=0、Feb=1等)。