使用日期函数将日期解析为UTC的正确方法



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

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

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

现在我想用日期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".

这是我目前用来告诉日期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".

使用日期fns有什么合适的方法吗?寻找等效于矩的moment.utc()

我不知道"适当";,但是您可以使用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.上进行测试

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

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

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)

使用parse和zonedTimeToUtc 的示例

it('should parse polish date', async () => {
expect.assertions(1)
const dateWithoutTime = '29 gru 2003'
const parsed = parse(dateWithoutTime, 'd LLL yyyy', new Date(), {
locale: pl,
})
const dateUTC = zonedTimeToUtc(parsed, 'UTC')
expect(dateUTC.toISOString()).toStrictEqual('2003-12-29T00:00:00.000Z')
})

最新更新