Próbuję przekazać oba ciągi dat do new Date(t)
.
Spodziewam się, że oba ciągi reprezentują ten sam czas, w końcu, jeśli pominę godzinę, czy nie powinna to być północ tego dnia?
Ale podczas gdy
new Date("2016-02-16 00:00")
zwraca 16.02.2016, o północy czasu lokalnego zgodnie z oczekiwaniami,
new Date("2016-02-16")
zwraca 2016-02-16, północ UTC, co jest błędne, a przynajmniej nie to, czego się spodziewałem, biorąc pod uwagę to, co inny ciąg analizuje jako.
Zrozumiałbym to, gdyby obaj zachowywali się tak samo, niezależnie od tego, czy zwracają czas jako czas lokalny, czy jako UTC, ale wydaje się bardzo niekonsekwentne, dlaczego zwracają różne takie rzeczy.
Aby obejść ten problem, za każdym razem, gdy napotkam datę, która nie ma odpowiedniego znacznika czasu, mogę dodać „00:00”, aby uzyskać spójne zachowanie, ale wydaje się, że jest to raczej delikatne.
Otrzymuję tę wartość z elementu INPUT typu „datetime-local”, więc wydaje się szczególnie niespójne, że muszę obejść wartość zwracaną przez element strony.
Czy robię coś źle, czy powinienem robić coś inaczej?
źródło
2016-02-16 00:00
- to wcale nie wygląda na aktualny czas. ecma-international.org/ecma-262/6.0/… , ale nawet po umieszczeniuT
tam rzeczywiście zachowuje się inaczejOdpowiedzi:
Oto, co mówi specyfikacja ES5.1 :
Mówi również:
Ponieważ format wymaga
T
separatora między datą i godziną, prawidłowe czasy przechodzą do UTC:... podczas gdy w node.js nieprawidłowy czas (bez separatora T) wydaje się iść do czasu lokalnego specyficznego dla implementacji:
Zwróć uwagę, że ES6 zmieniło to, w tej samej części dokumentacji, w której zmienia się:
Radość z przełamywania zmian .
Edytować
Zgodnie z TC39 specyfikację należy interpretować jako ciągi daty i godziny bez strefy czasowej (np. „2016-02-16T00: 00: 00”) są traktowane jako lokalne (zgodnie z ISO 8601), ale ciągi zawierające tylko datę (np. „2016-02-16”) jako UTC (co jest niezgodne z ISO 8601).
źródło
Zgodnie ze specyfikacją :
Formaty ciągów daty i godziny są akceptowane
2016-02-16
jako poprawna dataA zatem
2016-02-16
przekłada się na2016-02-16T00:00:00.000Z
.Druga data
2016-02-16 00:00
nie jest zgodna z formatem i dlatego jej analiza jest zależna od implementacji. Najwyraźniej takie daty są traktowane jako mające lokalną strefę czasową, a Twoja przykładowa data zwróci różne wartości w zależności od strefy czasowej:Podsumowanie:
NaN
zamiast próbować analizować niezgodne daty. Po prostu przetestuj swój kod w przeglądarce Internet Explorer 11;)źródło
Być może napotykasz różnice między implementacjami ES5, ES6 a oczekiwanym wynikiem. Per Date.parse at MDN, „szczególnie w różnych implementacjach ECMAScript, w których ciągi takie jak„ 2015-10-12 12:00:00 ”mogą być analizowane jako NaN, UTC lub lokalna strefa czasowa” ma znaczenie.
Dodatkowe testy w Firefoksie 44 i IE 11 ujawniły, że oba zwracają obiekt daty dla
new Date("2016-02-16 00:00")
którego obiekt zwraca NaN podczas próby uzyskania wartości składnika daty i którego wartością toString jest „Invalid Date” (nie „NaN”). Dlatego dołączanie „00:00, aby uzyskać spójne zachowanie” może łatwo zepsuć się w różnych przeglądarkach.Jak zauważono w innych odpowiedziach
new Date("2016-02-16")
, domyślnie stosowane jest przesunięcie strefy czasowej o zero, co daje północ UTC zamiast lokalnej.źródło
Według
DateParser::Parse()
kodów źródłowych V8 dla Chrome.źródło
Dodaje przesunięcie strefy czasowej do pliku
00:00
new Date("2016-02-16")
wyjściaTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Moja strefa czasowa to IST z wartością przesunięcia (w minutach)
+330
, więc dodała 330 minut do 00:00.Zgodnie z ecma-262, sekcja 20.3.3.2 Date.parse (string)
Gdy jawnie ustawisz jednostki czasu,
new Date("2016-02-16 00:00")
których użyje, ustaw to jakohours
iminutes
,W innym przypadku, jak podano w 2 0.3.1.16
źródło
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
gdzie twierdzi, że musi być taki sam?