如何将日期和时间解析为通用时间戳?

How to parse date and time into a universal timestamp?

背景:

我正在开发一个 fit-bit 健身应用程序。 因此,我从 fit-bit API 获得更新,其中包含日期、时间和当时的心率,格式如下:

date = "2021-02-01"
time = "14:15:00" 
bpm: 78

现在,我需要将其转换为时间戳并以 =>(timestamp: heart-rate) 格式保存心率 我根据 timetsamp 从应用程序查询心率数据 - 所以它们必须匹配。

问题: 我正在使用 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 timestamp(ISO 8601 的一个版本),将其解析为日期,然后获取其时间值,例如

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
);

看看Why does Date.parse give incorrect results?

也很有用

如果您有 UTC 值作为开头,您只需使用适当的年、月、日等值调用 Date.UTC 即可获取时间值以直接用作时间戳(记住月份是零索引,因此从日历月份数字中减去 1,例如 Jan = 0,Feb = 1,等等)。