Parsa datum utan tidszon javascript
Jag vill analysera ett datum utan tidszon i JavaScript. Jag försökte:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Vilket returnerade Fri Jul 08 2005 02:00:00 GMT+0200 (centraleuropeisk sommartid):
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
returnerar samma resultat och:
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
ger också samma resultat.
Jag vill analysera tid:
- utan tidszon.
- utan att anropa en konstruktor
Date.UTCeller newDate(year, month, day). - genom att helt enkelt skicka en sträng till Date-konstruktorn (utan prototypmetoder).
Jag måste skapa ett Date-objekt, inte en String.
Svar #1
Jag hade samma problem. Jag får ett datum som en sträng, till exempel: '2016-08-25T00:00:00', men jag behöver ha ett Date-objekt med korrekt tid. För att konvertera strängen till ett objekt använder jag getTimezoneOffset:
var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() + userTimezoneOffset);
getTimezoneOffset() kommer att returnera antingen ett negativt eller positivt värde. Detta måste subtraheras för att fungera på alla platser i världen.
Svar #2
Datumet är korrekt analyserat, det är bara toString som visar tidsstämpeln i din lokala tidszon:
let s = "2005-07-08T11:22:33+0000";
let d = new Date(Date.parse(s));
// this logs for me
// "Fri Jul 08 2005 13:22:33 GMT+0200 (Central European Summer Time)"
// and something else for you
console.log(d.toString())
// this logs
// Fri, 08 Jul 2005 11:22:33 GMT
// for everyone
console.log(d.toUTCString())Javascript Date-objekt är tidsvärden - de innehåller endast ett antal millisekunder sedan epoken. Det finns ingen tidszonsinformation i ett Date-objekt. Vilket kalend datum (dag, minuter, sekunder) denna tidsstämpel representerar är en fråga om tolkning (en av to...String metoderna).
Exemplet ovan visar att datumet tolkas korrekt för offset +0000 - det vill säga, det innehåller faktiskt en mängd millisekunder som motsvarar "2005-07-08T11:22:33" i GMT.
Svar #3
Eftersom det egentligen är ett formateringsproblem när man visar datumet (t.ex. visas i lokal tid), gillar jag att använda det nya(ish) Intl.DateTimeFormat-objektet för att utföra formateringen eftersom det är mer explicit och ger fler utdataalternativ:
const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));
console.log(dateAsFormattedString) // "June 1, 2019"
Som visat, genom att sätta timeZone till 'UTC' kommer det inte att utföra lokala konverteringar. Som en bonus tillåter det dig också att skapa mer polerade resultat. Du kan läsa mer om Intl.DateTimeFormat-objektet på Mozilla - Intl.DateTimeFormat.
Samma funktionalitet kan uppnås utan att skapa ett nytt Intl.DateTimeFormat-objekt. Passa helt enkelt lokalisering och datumalternativ direkt till toLocaleDateString()-funktionen.
const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
const myDate = new Date('2019-06-01T00:00:00.000+00:00');
myDate.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"
Svar #4
Jag stötte på samma problem och kom sedan ihåg något konstigt om ett äldre projekt jag arbetade med och hur de hanterade detta problem. Jag förstod det inte då och brydde mig inte riktigt förrän jag stötte på problemet själv
var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]
new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600
Av någon anledning sätter det att ange datumet som "01-02-2014" tidszonen till noll och ignorerar användarens tidszon. Detta kan vara en slump i Date-klassen men det fanns för en tid sedan och finns idag. Och det verkar fungera i flera webbläsare. Prova det själv.
Denna kod är implementerad i ett globalt projekt där tidszoner spelar stor roll men personen som tittade på datumet brydde sig inte om exakt när det introducerades.
Svar #5
Jag hittade JavaScript Date Object och tidszoner | Åtgärdar en "en dag fel"-bugg på YouTube. Detta fixar/återställer offseten för den lokala tidszonen. Det finns en fantastisk förklaring till detta problem i videon.
// date as YYYY-MM-DDT00:00:00Z
let dateFormat = new Date(date)
// Methods on Date Object will convert from UTC to users timezone
// Set minutes to current minutes (UTC) + User local time UTC offset
dateFormat.setMinutes(dateFormat.getMinutes() + dateFormat.getTimezoneOffset())
// Now we can use methods on the date obj without the timezone conversion
let dateStr = dateFormat.toDateString();