Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用日期fns将日期解析为UTC的正确方法_Javascript_Typescript_Date_Timezone_Date Fns - Fatal编程技术网

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

Javascript 使用日期fns将日期解析为UTC的正确方法,javascript,typescript,date,timezone,date-fns,Javascript,Typescript,Date,Timezone,Date Fns,我有一个带有时间戳的日志文件 2020-12-03 08:30:00 2020-12-03 08:40:00 ... 我从日志提供程序的文档中了解到,时间戳是用UTC编写的(尽管不使用ISO格式) 现在我想: 因为我的计算机的区域设置是UTC+1,所以我看到: > "2020-12-03T07:40:00Z" 预期: > "2020-12-03T08:40:00Z". 以下是我目前用来告诉date fns解析为UTC的方法: const

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

2020-12-03 08:30:00
2020-12-03 08:40:00
...
我从日志提供程序的文档中了解到,时间戳是用UTC编写的(尽管不使用ISO格式)

现在我想:

因为我的计算机的区域设置是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".
使用日期fns是否有合适的方法?寻找与矩的
矩.utc()等价的时间戳,我不知道“正确”是什么意思,但您可以使用它来将时间戳视为具有您喜欢的任何偏移量或时区,包括utc,例如

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

// Parse using location for offset
let loc = 'UTC';
let s   = '2020-12-03 08:30:00';
let fIn = 'yyyy-MM-dd HH:mm:ss';
let utcDate =  zonedTimeToUtc(s, loc);

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

您可以在。

使用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')
  })

您可能需要查看您知道的偏移量,以将存储的日期调整到您所在的时区。Date fns tz支持Intl.DateTimeFormat。无论哪种方式,您都应该指出datetime值的时区。您可以使用您的hack:
parseIso(toParse+'Z').toISOString()
如果将“2020-12-03 08:40:00”解析为UTC+1,则Z时间是07:40:00Z,而不是09:40:-)谢谢RobG,我编辑来修正错误谢谢这就是我要找的!但是,您的代码没有使用
fIn
(幸运的是,在本例中,它在UTC解析,但日志的格式可能不太友好)<代码>ZonedTimeoutc(解析(s、fIn、新日期()),loc)有效。@YannP是的,如果日期fns不能识别格式,则需要添加解析。我发现总是需要传递一个日期来解析一个无法解释的设计决策。完全同意。我不得不在我的请求中添加一条评论来解释为什么它是“需要的”。。。
 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')
  })