webentwicklung-frage-antwort-db.com.de

Ruft den ISO-String von einem Datum ohne Zeitzone ab

Meine Konfiguration ist die Zeitzone von Lissabon. Wenn ich new Date() mache, erhalte ich mein aktuelles lokales Datum/Uhrzeit, was Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time) ist.

Wenn ich den ISO-String mit toISOString() erhalte, wird die Zeitzone angewendet und ich erhalte Folgendes:

2017-04-28T00:10:55.964Z

Das Problem ist, dass das Datum vor einigen Minuten so war (gestern):

2017-04-27T23:45:05.654Z

Ich habe moment.js (neu dazu) ausprobiert und so etwas gemacht

document.write(moment('2017-04-28').format())

Aber ich bekomme diesen 2017-04-28T00:00:00+01:00, der nicht 2017-04-28T00:00:00.000Z ist 

Ich möchte diesen Wert als Parameter einer restful-Methode übergeben, um ihn automatisch als DateTime-Typ zu analysieren, aber wenn ich die Ausgabe von moment.js übergebe, wird er als 2017-04-27 23:00:00.00 analysiert

Wenn ich ein neues Datum mit new Date() oder mit new Date('2017-04-27') (Datumsteil) erstelle, möchte ich das ISO-Format wie folgt ohne Zeitzone ohne Zeitzone erhalten

2017-04-28T00:00:00.000Z

Gibt es eine Javascript-Methode wie toISOString () oder vielleicht einen Moment, um dieses Format zu erhalten?

Egal welche Zeitzone oder welcher Tageszeitpunkt, ich simuliere einfach, dass es Mitternacht des angegebenen Datums ist.

8
Maximus Decimus

Es ist sehr unklar, was Sie fragen. Wenn das UTC-Datum mit den Stunden immer 0 sein soll, setzen Sie die UTC-Stunden auf 0 und verwenden Sie toISOString, z.

var d = new Date();
d.setUTCHours(0,0,0,0);
console.log(d.toISOString());

Natürlich wird hier das UTC-Datum angezeigt, das sich vom Datum des Systems unterscheiden kann, das das Datum erstellt hat.

Ebenfalls,

new Date('2017-04-27').toISOString();

sollte zurückgeben 2017-04-27T00: 00: 00Z (dh es sollte gemäß ECMA-262 als UTC analysiert werden, was im Gegensatz zu ISO 8601 steht, das es als lokal behandeln würde), dies ist jedoch nicht in allen Fällen zuverlässig eingesetzte Implementierungen.

Wenn Sie nur das aktuelle Datum im ISO 8601-Format erhalten möchten, können Sie Folgendes tun:

if (!Date.prototype.toISODate) {
  Date.prototype.toISODate = function() {
    return this.getFullYear() + '-' +
           ('0'+ (this.getMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getDate()).slice(-2);
  }
}

console.log(new Date().toISODate());

Da der integrierte toISOString jedoch UTC verwendet, kann dies verwirrend sein. Wenn das UTC-Datum erforderlich ist, gilt Folgendes:

if (!Date.prototype.toUTCDate) {
  Date.prototype.toUTCDate = function() {
    return this.getUTCFullYear() + '-' +
           ('0'+ (this.getUTCMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getUTCDate()).slice(-2);
  }
}

console.log(new Date().toUTCDate());

5
RobG

Sie können dies erreichen, indem Sie einfach alles, was Sie benötigen, mit moment.format() formatieren und dann einfach das zusätzliche Z an den String anhängen. Sie müssen dies tun, da Z in dem Moment ist, in dem JS für die Ausgabe reserviert ist.

var date = moment('2014-08-28').format("YYYY-MM-DDT00:00:00.000") + "Z";

Geigenbeispiel https://jsfiddle.net/2avxxz6q/

3
li x

Sie können https://momentjs.com/docs/#/displaying/as-iso-string /verwenden.

moment().toISOString(keepOffset);

Sie benötigen keine moment.js-Bibliothek, Sie können nur Datumskomponenten analysieren und verbinden. Zum Beispiel

type Components = {
  day: number,
  month: number,
  year: number
}

export default class DateFormatter {
  // 2018-11-11T00:00:00
  static ISOStringWithoutTimeZone = (date: Date): string => {
    const components = DateFormatter.format(DateFormatter.components(date))
    return `${components.year}-${components.month}-${components.day}T00:00:00`
  }

  static format = (components: Components) => {
    return {
      day: `${components.day}`.padStart(2, '0'),
      month: `${components.month}`.padStart(2, '0'),
      year: components.year
    }
  }

  static components = (date: Date): Components => {
    return {
      day: date.getDate(),
      month: date.getMonth() + 1,
      year: date.getFullYear()
    }
  }
}
0
onmyway133

Ich nehme an, Sie möchten das aktuelle Datum in ISO 8601 erhalten, um es an Ihre API zu übergeben. Vielleicht hilft es, einen Moment.js-Wrapper für natives JavaScript zu verwenden, das here genannt wird.

Wie in deinem Beispiel:

document.write(moment('01/12/2016', 'DD/MM/YYYY', true).toISOString());

Ausschnitt:

$(function(){
  var displaysTime = $('#divTime');
  displaysTime.text(moment.utc('27/04/2017', 'DD/MM/YYYY', true).toISOString());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<div id="divTime">
</div>

0
Smit