使用 date-fns 将日期解析为 UTC 的正确方法

Yan*_*nnP 14 javascript timezone date typescript date-fns

我有一个带有一些时间戳的日志文件

2020-12-03 08:30:00
2020-12-03 08:40:00
...
Run Code Online (Sandbox Code Playgroud)

我从日志提供商的文档中知道时间戳是用 UTC 编写的(尽管不使用 ISO 格式)

现在我想用 date-fns 解析它们

const toParse = "2020-12-03 08:40:00"
parse(toParse, 'yyyy-MM-dd HH:mm:ss', new Date()).toISOString()
Run Code Online (Sandbox Code Playgroud)

因为我的计算机的区域设置是 UTC+1,所以我看到的是:

> "2020-12-03T07:40:00Z"
Run Code Online (Sandbox Code Playgroud)

预期的:

> "2020-12-03T08:40:00Z".
Run Code Online (Sandbox Code Playgroud)

这是我目前用来告诉 date-fns 解析为 UTC 的技巧:

const toParse = "2020-12-03 08:40:00"
parse(toParse + '+00', 'yyyy-MM-dd HH:mm:ss' + 'X', new Date()).toISOString()
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,

> "2020-12-03T08:40:00Z".
Run Code Online (Sandbox Code Playgroud)

有没有使用 date-fns 执行此操作的正确方法?寻找相当于 moment 的moment.utc()

Rob*_*obG 13

我不知道“正确”,但您可以使用zonedTimeToUtc将时间戳视为具有您喜欢的任何偏移量或时区,包括 UTC,例如

\n
// Setup\nvar {parse} = require(\'date-fns\');\nvar {zonedTimeToUtc} = require(\'date-fns-tz\');\n\n// Parse an ISO 8601 timestamp recognised by date-fns\nlet loc = \'UTC\';\nlet s1   = \'2020-12-03 08:30:00\';\nlet utcDate =  zonedTimeToUtc(s1, loc);\n\n// Show UTC ISO 8601 timestamp\nconsole.log(utcDate.toISOString()); // "2020-12-03T08:30:00.000Z"\n\n// Parse non\xe2\x80\x93standard format yyyyMMdd\nlet s2 = \'20210119\';\nlet fIn = \'yyyyMMdd\';\nlet d = zonedTimeToUtc(parse(s2, fIn, new Date()), loc);\nconsole.log(d.toISOString()); // "2021-01-19T00:00:00.000Z"```\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在npm.runkit.com/date-fns进行测试。

\n


esc*_*sam 5

我认为您正在寻找parseJSON,它支持多种格式(但不允许您指定源格式)。

将 UTC 时间的完整 ISO 日期字符串(传输 JSON 中的日期的典型格式)转换为 JavaScript Date 实例。

import { parseJSON } from 'date-fns';
const utcDate = parseJSON('2020-12-03 08:40:00');

// Thu Dec 03 2020 19:40:00 GMT+1100 (Australian Eastern Daylight Time)
Run Code Online (Sandbox Code Playgroud)