javascript - Riktig måte å analysere en dato som UTC ved bruk av date-fns


Jeg har en loggfil med noen tidsstempler

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

Jeg vet fra loggleverandørens dokumentasjon at tidsstemplene skrives i UTC (selv om de ikke bruker ISO-format)

Nå vil jeg analysere dem med date-fns :

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

Og fordi lokalinnstillingen på datamaskinen min er i UTC+1, er dette hva jeg ser:

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

forventet:

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

Her er trikset jeg for øyeblikket bruker for å få date-fns til å analysere som UTC :

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

Og som forventet,

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

Finnes det noen riktig måte å gjøre dette på ved bruk av date-fns? Ser etter et ekvivalent til moments moment.utc()

Svar #1

Jeg vet ikke om «riktig», men du kan bruke zonedTimeToUtc for å behandle et tidsstempel som om det har hvilken som helst forskyvning eller tidssone du ønsker, inkludert UTC, for eksempel.

// 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"```

Du kan teste det på npm.runkit.com/date-fns.

Svar #2

Jeg tror du leter etter parseJSON, som støtter flere formater (men lar deg ikke spesifisere kildeformatet).

Konverterer en fullstendig ISO-dato streng i UTC-tid, det typiske formatet for å sende en dato i JSON, til en JavaScript Date-instans.

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)

Relaterte artikler