2017-08-22 1 views
4

Da der Zeitstempel sich vor kurzem um 1,5 Milliarden dreht, taucht in einem meiner Skripte ein merkwürdiger (und anscheinend zufälliger) Fehler auf.Zufälliger schlechter Umwandlungszeitstempel mit neuem Datum()

ich ein Datetimepicker zu initialisieren bekam, habe ich dies:

$('#datepickerfield').data('DateTimePicker').date(new Date(1502173800000)); 

1502173800000 natürlich eine Millisekunde Zeitstempel. Die meiste Zeit, es funktioniert einfach.

Aber wie Sie sehen können, könnte irgendwie 15021738 ... (und tatsächlich, irgendwann, IS) fälschlicherweise als 15/02/1738 interpretiert werden (französisches TT/MM/JJJJ-Format) ... Das war nicht das Fall mit Zeitstempeln beginnend mit 1499 oder sogar 1500 und der Bug erscheint gerade im Moment, wenn Zeitstempel mit 1501 beginnen (führt bis zum 15. Januar) und so weiter.

Es ZUFALL erscheint das ist sehr ärgerlich und fast unmöglich, auf der Serverseite zu beheben (zu viele Fälle zu betrachten, auch ein Datum wie 15/02/1738 in manchen Kontexten echt sein könnte)

i So habe zwei Fragen:

  1. hat das schon jemand erlebt? Ist das ein bekannter JavaScript-Fehler (ich habe gesucht, aber keine Beschwerde in dieser Angelegenheit gefunden.)
  2. Wie könnte ich diesen Anruf durch einen besseren ersetzen? Ich benutze Angular v1.5, Moment.js, JQuery 2.x - dieser genaue Aufruf ist in einem Angular-Controller.

Vielen Dank für Ihre Aufmerksamkeit

Denis

+0

Können Sie eine Demo, das zu reproduzieren erstellen? 'neues Datum (1502173800000)' zurück 'Di Aug 08 2017 09:30:00 GMT + 0300 (EEST)' das ist vermutlich richtig. –

+0

über 50 mal versucht und immer einen guten Wert haben. Könnten Sie diesen Fehler reproduzieren? – sheplu

+0

* sogar ein Datum wie 15/02/1738 könnte in einigen Kontexten echt sein * Vielleicht, aber nicht, wenn Sie Millisekunden-Zeitstempel verwenden, da die Zählung am 01.01.1970 beginnt. –

Antwort

1

Es stellt sich heraus, dass das Problem nichts mit Datum zu tun hat (ersetzt ich den Anruf mit moment.unix (Zeitstempel), und das Problem war immer noch da).

Erstens war es schließlich nicht so zufällig. Die Konvertierung vom Zeitstempel zum Datum geschieht nur dann, wenn "möglich", dh wenn die vier ersten Ziffern wie ein mögliches "ddmm" aussehen (seit 1501 ...), die vier folgenden Ziffern wie ein "JJJJ" (fast immer) und die 2 folgenden folgen "hh", dh zwischen 0 und 23

- HAPPY END -

Dieser seltsamen Parsing-Fehler ist auf eine Option von Datetimepicker (dies hier: http://eonasdan.github.io/bootstrap-datetimepicker/), die standardmäßig falsch ist.

useStrict: true 

Einzelheiten (die Option selbst die Moment.js Bibliothek beeinflusst), siehe http://eonasdan.github.io/bootstrap-datetimepicker/Options/#usestrict