Vraag javascript Datum probleem met de tijdzone


Ik heb een js Date-object met opgegeven waarden voor datum en jaar nodig. ik zou verwachten new Date("2000-01-01") om me Date-object met 2000 als waarde voor te geven getFullYear(), maar als de tijdsinstellingen van mijn computer zijn ingesteld op de tijdzone van Chicago, krijg ik het Fri Dec 31 1999 18:00:00 GMT-0600 (CST)en voor Buenos Aires: Fri Dec 31 1999 22:00:00 GMT-0200 (ARST).

Is er een manier om Date-object te maken met .getFullYear() het retourneren van de datum die we in de constructor hebben ingesteld, ongeacht de tijdzone die is ingesteld op de machine van de gebruiker?

Bijwerken: Ik heb dit Date-object nodig voor gebruik in een andere bibliotheek (die zijn .getFullYear() methode, dus het gebruik van UTC-getters helpt niet echt.


10
2018-03-20 19:54


oorsprong


antwoorden:


Bij het parseren van een string naar een Date in JavaScript, een waarde die in is YYYY-MM-DD formaat wordt geïnterpreteerd als een UTC waarde, in plaats van een lokale waarde.

De sleutel is dat de delen worden gescheiden door koppeltekens en dat er geen tijdzone-informatie in de tekenreeks staat. De ECMAScript 5.1 Spec zegt in §15.9.1.15:

... De waarde van een afwezige tijdzoneverschuiving is "Z".

Dat betekent dat, als u geen offset opgeeft, wordt aangenomen dat u UTC bedoelde.

Merk op dat dit het tegenovergestelde is van wat ISO-8601 zegt, dit is het gedrag dat is veranderd in ECMAScript 2015 (6.0), dat zegt in §20.3.1.16:

... Als de tijdzone-offset afwezig is, wordt de datum-tijd geïnterpreteerd als een lokale tijd.

Daarom, wanneer deze voorziening van ES6 correct wordt geïmplementeerd, worden stringwaarden van dit formaat die vroeger als UTC werden geïnterpreteerd, geïnterpreteerd als lokale tijd. Ik heb hierover geblogd hier.

De oplossing is eenvoudig. Vervang de koppeltekens door schuine strepen:

var s = "2000-01-01";
var dt = new Date(s.replace(/-/g, '/'));

Een andere oplossing die aanvaardbaar is, is om een ​​tijdstip van de middag toe te wijzen in plaats van middernacht tot de datum. Dit wordt als lokale tijd geparseerd en is ver genoeg verwijderd om DST-conflicten te voorkomen.

var s = "2000-01-01";
var dt = new Date(s + "T12:00:00");

Als alternatief, overweeg een bibliotheek zoals moment.js wat veel verstandiger is.

var s = "2000-01-01";
var dt = moment(s, 'YYYY-MM-DD').toDate();

15
2018-03-21 17:19



U kunt een nieuwe methode schrijven naar 'Date.prototype' en deze gebruiken om een ​​datum op te halen die de lokale tijdzone-offset bevat.

  //return the date with depend of Local Time Zone
  Date.prototype.getUTCLocalDate = function () {
    var target = new Date(this.valueOf());
    var offset = target.getTimezoneOffset();
    var Y = target.getUTCFullYear();
    var M = target.getUTCMonth();
    var D = target.getUTCDate();
    var h = target.getUTCHours();
    var m = target.getUTCMinutes();
    var s = target.getUTCSeconds();

    return new Date(Date.UTC(Y, M, D, h, m + offset, s));
  };

1
2017-08-03 11:56