Hoe converteer je een Javascript-datum naar UTC?

Stel dat een gebruiker van uw website een datumbereik invoert.

2009-1-1 to 2009-1-3

U moet deze datum naar een server verzenden voor wat verwerking, maar de server verwacht alle data en tijden in UTC.

Stel nu dat de gebruiker zich in Alaska of Hawaï of Fiji bevindt. Omdat ze in een tijdzone behoorlijk anders zijn dan UTC, moet het datumbereik worden geconverteerd naar zoiets:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Gebruik van het JavaScript-datumobject, hoe zou u de eerste “gelokaliseerde” datumbereik omzetten in iets dat de server zal begrijpen?


Antwoord 1, Autoriteit 100%

De toISOString()Methode retourneert een tekenreeks in vereenvoudigde uitgebreide ISO
Formaat (ISO 8601 ), wat altijd 24 of 27 tekens lang is
(YYYY-MM-DDTHH:mm:ss.sssZof ±YYYYYY-MM-DDTHH:mm:ss.sssZ,
respectievelijk). De tijdzone is altijd zero utc offset, zoals aangegeven door
het achtervoegsel “Z“.

Bron: MDN Web Documenten

Het formaat dat u nodig hebt, is gemaakt met de .toISOString()-methode. Voor oudere browsers (IE8 en onder), die niet in native deze methode ondersteunen, is de Shim Hier :

Hiermee geeft u de mogelijkheid om te doen wat u nodig heeft:

var isoDateString = new Date().toISOString();
console.log(isoDateString);

Antwoord 2, Autoriteit 135%

Eenvoudig en stom

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
 return new Date(now_utc);

Antwoord 3, Autoriteit 51%

Hier is mijn methode:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

De resulterende utcObject is niet echt een UTC-datum, maar een lokale datum verschoven om overeen te komen met de UTC-tijd (zie opmerkingen). In de praktijk doet het echter het werk.


Antwoord 4, Autoriteit 7%

Converteren naar ISO zonder datum / tijd te wijzigen

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Converteren naar ISO met verandering in de datum / tijd (datum / tijd wordt gewijzigd)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Fiddle Link


Antwoord 5, Autoriteit 6%

Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}
Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Antwoord 6, autoriteit 5%

Browsers kunnen verschillen, en je moet er ook aan denken om informatie die door de client is gegenereerd niet te vertrouwen, maar de onderstaande verklaring werkt voor mij (Google Chrome v24 op Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


edit: “Hoe is dit anders dan alleen new Date()?” zie hier: https://developer.mozilla.org/ nl-NL/docs/Web/JavaScript/Reference/Global_Objects/Date

  • Als er geen argumenten zijn opgegeven, maakt de constructor een JavaScript Date-object voor de huidige datum en tijd volgens de systeeminstellingen.
  • Opmerking: waar Date wordt aangeroepen als een constructor met meer dan één argument, vertegenwoordigen de opgegeven argumenten de lokale tijd. Als UTC gewenst is, gebruik dan new Date(Datum. UTC(…)) met dezelfde argumenten. (opmerking: Date.UTC() retourneert het aantal milliseconden sinds 1970-01-01 00:00:00 UTC)

Het toevoegen van de 60000 * Date.getTimezoneOffset() zoals eerdere antwoorden hebben aangegeven, is onjuist. Ten eerste moet u alle datums/tijden beschouwen als UTC met een tijdzone-modifier voor weergavedoeleinden.

Nogmaals, de browsers kunnen echter de datum. Ontvangsttijd () retourneert het aantal milliseconden sinds 1970-01-01 UTC / GMT. Als u een nieuwe datum maakt met dit nummer zoals ik hierboven doe, is het UTC / GMT. Als u het echter weergeeft door .ToString () te bellen, lijkt het in uw lokale timezone te zijn, omdat .tostrering () uw lokale timezone gebruikt, niet de tijdzone van het datumobject dat het wordt opgeroepen.

Ik heb ook gevonden dat als u. GetinTimeZoneOffset () op een datum noemt, het uw lokale timezone retourneert, niet de tijdzone van het datumobject dat u het hebt gebeld (ik kan dit echter niet verifiëren om echter dit te zijn).

In mijn browser, toevoegen 60000 * datum.getimezoneOffset () maakt een datetime dat niet UTC is. Wanneer echter wordt weergegeven in mijn browser (ex: .tostring ()), geeft het een datetime weer in mijn lokale timezone die de UTC-tijd zou zijn als de tijdzone-info wordt genegeerd.


Antwoord 7, Autoriteit 4%

Een andere oplossing om naar UTC te converteren en het als een datumobject te houden:
(Het werkt door het ‘GMT’-deel van het einde van de geformatteerde reeks te verwijderen en het vervolgens terug te zetten in de datumconstructeur)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));
console.log(now_utc)

Antwoord 8, Autoriteit 4%

var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

Antwoord 9, Autoriteit 3%

Mijn oplossing houdt de datum hetzelfde, ongeacht welke tijdzone op de clientzijde is ingesteld. Misschien vindt iemand het nuttig.

Mijn gebruik Case:

Ik ben een todo-app aan het maken waarin je de datum van je taak instelt. Deze datum moet constant blijven, ongeacht in welke tijdzone u zich bevindt.

Voorbeeld. Je wilt je vriend op 25 juni om 8 uur ‘s ochtends bellen.

Je maakt deze taak 5 dagen van tevoren (20 juni) terwijl je in China bent.

Vervolgens vlieg je op dezelfde dag voor een paar dagen naar New York.

En op 25 juni, terwijl je nog steeds in New York bent, word je wakker om 7.30 uur (wat betekent dat je binnen 30 minuten een taakmelding zou moeten ontvangen (zelfs als het al 13.30 uur is in China waar je was) bij het maken van de taak)

Dus de taak is het negeren van de tijdzone. Het betekent ‘Ik wil het om 8 uur ‘s ochtends doen in de tijdzone waarin ik me bevind’.

Wat ik doe is laten we zeggen: ‘Ik neem aan dat je altijd in London Timezone – UTC bent’.

Wat het betekent is – wanneer de gebruiker een datum kiest in haar/zijn tijdzone – ik converteer deze datum naar dezelfde datum in UTC. d.w.z. Jij kiest 8 uur in China, maar ik converteer het naar 8 uur in UTC.

Dan – de volgende keer dat u de app opent – lees ik de datum die is opgeslagen in UTC en converteer ik deze naar dezelfde datum in uw huidige tijdzone – bijv. Ik converteer 8 uur in UTC naar 8 uur in de tijdzone van New York.

Deze oplossing betekent dat de datum iets anders kan betekenen, afhankelijk van waar je bent bij het instellen en waar je het leest, maar het blijft constant op een manier dat het ‘voelt’ alsof je altijd in dezelfde tijdzone bent .

Laten we wat code schrijven:

Ten eerste – we hebben 2 hoofdfuncties voor het converteren van/naar UTC, waarbij we de tijdzone negeren:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );
  return new Date(timestamp);
}
export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Vervolgens bewaar/lees ik deze datum als:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}
function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);
  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

Antwoord 10, autoriteit 2%

Probeer je de datum om te zetten in een dergelijke string?

Ik zou een functie maken om dat te doen, en, hoewel het enigszins controversieel is, toevoegen aan het Date-prototype. Als u zich daar niet prettig bij voelt, kunt u het als een op zichzelf staande functie plaatsen, waarbij u de datum als parameter doorgeeft.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;
    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Als u het in UTC-tijd nodig had, vervangt u alle GET * -functies met GETUTC *, bijv.: GETUTCFHOLDEAR, GETUTCAMONTH, GETUTHEURS … en vervolgens “+00: 00” aan het einde toevoegen in plaats van de tijdzone van de gebruiker offset.


Antwoord 11, Autoriteit 2%

Mijn aanbeveling bij het werken met datums is het parseren van de datum in afzonderlijke velden van gebruikersinvoer. Je kunt het als een volledige snaar gebruiken, maar je speelt met vuur.

JavaScript kan twee gelijke data in verschillende formaten anders behandelen.

HTPS: //Developer.mozilla. Org / NL-VS / Documenten / Web / JavaScript / Referentie / Global_Objects / Datum / Parse

Nooit iets doen als:

new Date('date as text');

Nadat u uw date hebt geparseerd in de afzonderlijke velden van de gebruikersinvoer, maakt u een datumobject. Zodra het datumobject is gemaakt, converteer het naar UTC door de offset van de tijdzone toe te voegen. Ik kan niet benadrukken hoe belangrijk het is om de offset te gebruiken van het datumobject vanwege DST (dat is echter een andere discussie om te laten zien waarom).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');
var date = new Date(year, month, dayOfMonth);
var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds
var utcDate = new Date(date.getTime + offsetInMs);

Nu kunt u de datum in UTC-tijd aan de server doorgeven. Nogmaals, ik zou het ten zeerste aanbevelen om geen datumstrings te gebruiken. Geef het door aan de server die is uitgesplitst tot de laagste granulariteit die u nodig hebt, b.v. jaar, maand, dag, minuut of als een waarde zoals milliseconden uit het Unix-tijdperk.


Antwoord 12, autoriteit 2%

date = '2012-07-28'; stringdate = new Date(date).toISOString();

zou moeten werken in de meeste nieuwere browsers. het geeft 2012-07-28T00:00:00.000Zterug in Firefox 6.0


Antwoord 13

Als je veel met dates te maken hebt, is het de moeite waard om moment.js (http://momentjs.com) te gebruiken. . De methode om naar UTC te converteren zou zijn:

moment(yourTime).utc()

U kunt de notatie gebruiken om uw datum te wijzigen in elke gewenste notatie:

moment(yourTime).utc().format("YYYY-MM-DD")

Er zijn ook offset-opties in het moment, maar er is een aanvullende aanvullende bibliotheek voor het omgaan met tijdzone (http://momentjs .com/timezone/). De tijdconversie zou zo eenvoudig zijn:

moment.tz(yourUTCTime, "America/New_York")

Antwoord 14

Ik heb ontdekt dat de datumparsing jQuery Globalization Pluginhet beste werkt. Andere methoden hadden problemen met meerdere browsers en dingen zoals date.js waren al een tijdje niet bijgewerkt.

U hebt ook geen DATEPICKER op de pagina nodig. U kunt gewoon iets noemen dat lijkt op het voorbeeld in de documenten:

$.parseDate('yy-mm-dd', '2007-01-26');

Antwoord 15

Ik heb net ontdekt dat de 1.2.3 versie van Steven Levithan’s datum.format.js doet precies wat ik wil. Hiermee kunt u een formaatstring voor een JavaScript-datum leveren en zal worden geconverteerd van lokale tijd naar UTC. Hier is de code die ik nu gebruik:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);
// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

Antwoord 16

Deze functie werkt prachtig voor mij.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));
    // return the UTC version of the date
    return newDate.toISOString();
}

Antwoord 17

Als u datumobject

nodig heeft

Alleen de datum van de datum doorgeven Veronderstelt de tijd om 00:00 verschoven op tijdzone:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Als u huidige uren en minuten toevoegt, krijgt u de juiste datum:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

Antwoord 18

Dit is wat ik in het verleden heb gedaan:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

Antwoord 19

Deze methode geeft u: 2017-08-04T11:15:00.000+04:30en u kunt zone -variabele negeren om eenvoudig 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

Antwoord 20

moment.js utc methode ;

const moment = require('moment');
const utc = moment.utc(new Date(string));

Antwoord 21

Kijkend naar uw vraag, het is duidelijk dat u de datumbereik naar uw backend wilt verzenden voor verdere postverwerking.

Ik neem aan dat u conformeert aan de standaardgegevensrichtlijnen die verwachten dat de gegevens in een bepaald formaat zijn. Ik gebruik bijvoorbeeld Odata, die een restfull-API is die de datum-tijdobjecten verwacht in het formaat te zijn: –

YYYY-MM-DDT00: 00: 00.

Dat kan eenvoudig worden bereikt via het onderstaande snippet (wijzig het formaat volgens uw vereiste).

var mydate;//assuming this is my date object which I want to expose
var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Als u aan de andere kant bent, bevindt u zich in mijn situatie waarin u een datum van uw backend hebt ontvangen en de browser dat naar uw lokale datum omzet. Aan de andere kant is geïnteresseerd in de UTC-datum, dan kunt u het volgende uitvoeren: –

var mydate;//assuming this is my date object which I want to expose
var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/
UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

De code Snippet hierboven voegt in principe de tijd toe / trekt de tijd toegevoegd / afgetrokken door de browser op basis van de tijdzone.

Bijvoorbeeld als ik in EST (GMT-5) en mijn service een datum-tijdobject retourneert = Wed 17 2016 00:00:00 GMT-0500
Mijn browser geeft automatisch de timezone-offset (5 uur) af om mijn lokale tijd te krijgen. Dus als ik de tijd probeer te halen, krijg ik op 16 augustus 2016 19:00:00 GMT-0500. Dit veroorzaakt veel problemen. Er zijn veel bibliotheken die hier zeker gemakkelijker zullen maken, maar ik wilde de Pure JS-aanpak delen.

Voor meer informatie kunt u een kijkje nemen op: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ waar in ik mijn inspiratie.

Ik hoop dat dit helpt!


Antwoord 22

var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Hierdoor krijgt u de juiste UTC-datum en -tijd.
Het is omdat de getTimezoneOffset()u het tijdzoneverschil in minuten geeft.
Ik raad u aan om toISOString()niet te gebruiken omdat de uitvoer in de string zal staan. Daarom zult u in de toekomst de datum niet kunnen manipuleren


Antwoord 23

De getTimezoneOffset()methode retourneert het tijdzoneverschil, in
minuten, van huidige landinstelling (hostsysteeminstellingen) naar UTC.

Bron: MDN-webdocumenten

Dit betekent dat de afwijking positief is als de lokale tijdzone achter UTC ligt en negatief als deze voor ligt. Voor tijdzone UTC+02:00wordt bijvoorbeeld -120geretourneerd.

let d = new Date();
console.log(d);
d.setTime(d.getTime() + (d.getTimezoneOffset() * 60000));
console.log(d);

Antwoord 24

Als je datum de tijdzone heeft, kun je date-fns-tz:

import { zonedTimeToUtc } from 'date-fns-tz';
const dateBrazil = new Date() // I'm in Brazil, you should have or get the user timezone.
const dateUtc = zonedTimeToUtc(dateBrazil, 'America/Sao_Paulo')

Antwoord 25

Ik weet dat deze vraag oud is, maar keek naar hetzelfde probleem en één optie zou zijn om in plaats daarvan datum.valueof () naar de server te sturen. De waarde van de functie van de JavaScript van de JavaScript-datum verzendt het aantal milliseconden sinds middernacht 1 januari 1970 UTC.

waarde van ()


Antwoord 26

Momentpakket gebruiken, kunt u eenvoudig een datumreeks van UTC converteren naar een nieuw datumobject:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Dit helpt speciaal bij wanneer uw server geen TimeZone ondersteunt en u UTC-datum altijd in de server wilt opslaan en terug kunt krijgen als een nieuw datumobject. Bovenstaande code werkte voor mijn vereiste van een soortgelijke kwestie waar deze draad voor is. Hier delen, zodat het anderen kan helpen. Ik zie niet precies boven de oplossing in elk antwoord. Bedankt.


Antwoord 27

U kunt de volgende methode gebruiken om alle JS-datum in UTC te converteren:

let date = new Date(YOUR_DATE).toISOString()
// It would give the date in format "2020-06-16T12:30:00.000Z" where Part before T is date in YYYY-MM-DD format, part after T is time in format HH:MM:SS  and Z stands for UTC - Zero hour offset

Antwoord 28

Verreweg de beste manier waarop ik de GMT-tijd heb gevonden, krijgt eerst je lokale date-tijd. Converteer vervolgens naar GMT-string. Gebruik vervolgens de tekenreeks om nieuwe tijd te bouwen door de tijdzone te verwijderen.

let dtLocal = new Date()
let dt = new Date(dtLocal.toISOString().split('Z')[0])

Opmerking: – Het creëert het nieuwe datetime in GMT. Maar het is de tijd van de lokale datum waarop de tijdzone eraan zal worden bevestigd.


Antwoord 29

Wie is voor andere mensen die het doel is om het te krijgen als een “datumobject” en niet als een tekenreeks, en u wilt alleen de datum / tijd weergeven zonder de TZ (waarschijnlijk hardcoded), wat u kunt doen is:

const now = new Date();
const year = now.getUTCFullYear();
const month = now.getUTCMonth();
const day = now.getUTCDate();
const hour = now.getUTCHours();
const tomorrowUTC= new Date();
tomorrowUTC.setDate(day + 1); // +1 because my logic is to get "tomorrow"
tomorrowUTC.setYear(year);
tomorrowUTC.setMonth(month);
tomorrowUTC.Hours(hour);
// then use the tomorrowUTC for to display/format it
// tomorrowUTC is a "Date" and not a string.

je kunt dan dingen doen zoals:

We will delete your account at ${format(tomorrowUTC, 'EEEE do MMMM hh:mmaaa')} UTC

(formatis een DATE-FNS functie, u kunt andere lib gebruiken als u wilt);

Dit is een beetje “hacky” omdat dit nog steeds je lokale timezone gebruikt, maar als je gewoon de datum wilt weergeven en niet de tijdzone, dan werkt dit.


ANTWOORD 30

Dus dit is de manier waarop ik het moest doen omdat ik nog steeds een Javascript-datumobject wilde om te manipuleren als een datum en helaas veel van deze antwoorden moet je naar een string gaan.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)
//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 
var correctDate = new Date(newDate.setUTCHours(0))
//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

Other episodes