2017-01-19 10 views
0

Ich habe eine sehr harte Zeit mit Timzones und Datumsangaben in DatePickers behandelt. Und ich spreche von einem Szenario, in dem wir nicht an einer Zeitkomponente interessiert sind (denken Sie an Geburtsdatum).Javsascript Dates, Pickers and Timezones

Die meisten DatePicker da draußen leiden unter dem gleichen Problem. Ein Javascript Date-Objekt "unterstützt" sie. Und selbst wenn Ihr Datum die Pipe als UTC herunterkommt, ist das Javascript-Datum "Regional", basierend auf dem Browser, in dem die Site geladen ist.

Fakt ist, ein Geburtsdatum kümmert sich nicht um Zeitzonen. Es ist konstant. Es ist also ziemlich beleidigend, wenn ein Benutzer ein Geburtsdatum wählt und der vorherige Tag ist, was tatsächlich an den Server gesendet wird. Fast hätte ich das Baby und das Badewasser rausgeworfen und mit Strings in eine Texteingabe gegangen. Das ist kugelsicher.

Ich schweife ab. Eine Lösung, die ich an mehreren Stellen gesehen haben (die nicht zuverlässig arbeiten für uns sowieso) ist Code wie dieser

persons[i].BirthDate = persons[i].BirthDate.replace(/\d+/, 
     function (n) { return parseInt(n) + new Date().getTimezoneOffset() * 60000; } 

ich neugierig bin. Warum 60000?

//Deal with dates in milliseconds for most accuracy 
utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
newDateWithOffset = new Date(utc + (3600000*offset)); 

wo Offset etwas wie '10' ist:

Ich habe das auch gesehen. Was ist der 3600000?

Ich würde gerne wissen, was diese Dinge tun, bevor ich sie in Produktion bringe. Und vielleicht lag der Grund, warum sie nicht für uns arbeiteten, darin, dass wir sie nicht richtig verstanden und an anderen Stellen, z. der Server.

Danke.

+0

Mögliches Duplikat von [Wie erstellt man ein JavaScript Date-Objekt mit einer festgelegten Zeitzone ohne Verwendung einer Zeichenfolgendarstellung] (http://stackoverflow.com/questions/439630/how-do-you-create-a-javascript- date-object-with-a-set-Zeitzone-ohne-Verwendung-als) –

Antwort

1

getTime liefert die Zeit in Millisekunden und GetTimezoneOffset liefert sie in Minuten. Daher sind eine Minute 60 Sekunden oder 60.000 ms.
3.600.000 ms = 3.600 s = 60 min = 1 h So wird der Offest in Stunden gemessen.

+0

Danke. Welchen Sinn macht es, im ersten Code-Snippet die Anzahl der Minuten zum analysierten Datum hinzuzufügen? Soll das zurück nach UTC gebracht werden? Oder ist es von UTC zur regionalen Zeit? Ich glaube ich bin verwirrt darüber, was es von und zu konvertiert. – onefootswill

+0

Die Methode getTimezoneOffset() gibt den Zeitunterschied zwischen UTC-Zeit und lokaler Zeit in Minuten zurück.
Zum Beispiel, wenn Ihre Zeitzone GMT + 2 ist, wird -120 zurückgegeben. Diese Funktion bringt Sie also zu UTC. – Sascha

+0

der zwielichtige Aspekt zu all dem ist, dass der GMT-Offset ist anders als der UTC-Offset für meine Stadt. Also, diese Funktion funktioniert nicht und bringt mich zu 1 Stunde nach UTC zurück. Termine sind nicht einfach. – onefootswill