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

新手上路,请多包涵

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

2020-12-03 08:30:00
2020-12-03 08:40:00
...

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

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

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

因为我的计算机的语言环境是 UTC+1,所以我看到的是:

 > "2020-12-03T07:40:00Z"

预期的:

 > "2020-12-03T08:40:00Z".

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

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

正如预期的那样,

 > "2020-12-03T08:40:00Z".

使用 date-fns 是否有任何正确的方法来执行此操作?寻找相当于时刻的 moment.utc()

原文由 Yann Pellegrini 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

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

// Setup
var {parse} = require('date-fns');
var {zonedTimeToUtc} = require('date-fns-tz');

// Parse an ISO 8601 timestamp recognised by date-fns
let loc = 'UTC';
let s1   = '2020-12-03 08:30:00';
let utcDate =  zonedTimeToUtc(s1, loc);

// Show UTC ISO 8601 timestamp
console.log(utcDate.toISOString()); // "2020-12-03T08:30:00.000Z"

// Parse non–standard format yyyyMMdd
let s2 = '20210119';
let fIn = 'yyyyMMdd';
let d = zonedTimeToUtc(parse(s2, fIn, new Date()), loc);
console.log(d.toISOString()); // "2021-01-19T00:00:00.000Z"```

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

原文由 RobG 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为您正在寻找 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)

原文由 escapisam 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题