Chcę przeanalizować datę bez strefy czasowej w JavaScript. Próbowałem:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Zwroty pią, 08 lipca 2005, 02:00:00 GMT + 0200 (środkowoeuropejski czas letni)
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
Zwraca ten sam wynik
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
Zwraca ten sam wynik
Chcę przeanalizować czas:
Bez strefy czasowej.
Bez wywoływania konstruktora Date.UTC lub new Date (rok, miesiąc, dzień).
Proste przekazanie ciągu znaków do konstruktora Date (bez podejścia prototypowego).
Nie mam
Date
przedmiotu produktuString
.
Date.parse
btw i bezpośrednio przekazać łańcuch doDate
konstruktora.Date
obiekt, aby uzyskać prawidłowy obiekt do porównania dat w MongoDB:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Odpowiedzi:
Data jest przetwarzana poprawnie, to po prostu toString konwertuje ją na lokalną strefę czasową:
Obiekt JavaScript Date to znaczniki czasu - zawierają one tylko liczbę milisekund od epoki. W obiekcie Date nie ma informacji o strefie czasowej. To, która data kalendarzowa (dzień, minuty, sekundy) reprezentuje ten znacznik czasu, jest kwestią interpretacji (jedna z
to...String
metod).Powyższy przykład pokazuje, że data jest przetwarzana poprawnie - to znaczy, że faktycznie zawiera liczbę milisekund odpowiadającą „2005-07-08T11: 22: 33” w GMT.
źródło
new Date(Date.parse("2005-07-08T11:22:33+0000"))
, a data kopiowane przez konstruktora:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
. Oba rozwiązania, różne wyniki, drugie poprawne! Twoja odpowiedź była przydatna, właśnie wspomniano o niej w hunlock.com/blogs/Javascript_Dates-The_Complete_Reference . W górę.Mam ten sam problem. Otrzymuję datę jako ciąg, na przykład: „2016-08-25T00: 00: 00”, ale potrzebuję obiektu Date z poprawnym czasem. Aby przekonwertować String na obiekt, używam getTimezoneOffset:
getTimezoneOffset()
zwróci wartość ujemną lub dodatnią eteru. Należy to odjąć, aby działało w każdym miejscu na świecie.źródło
var userTimezoneOffset = date.getTimezoneOffset()*60000;
getTimezoneOffset()
zwraca liczbę minut w przeciwnym kierunku niż myślisz - moja strefa czasowa to UTC-4 w tej chwili, alegetTimezoneOffset()
zwraca dodatnie 240. DlategouserTimezoneOffset
należy ją odejmowaćdate.getTime()
, a nie dodawać do niej.new Date('2016-08-25T00:00:00Z')
myślę, że chodziło o manipulowanienew Date('2016-08-25T00:00:00Z')
tak, aby czas lokalny był wyświetlany z czasem 0:00, ale ten kod został pominiętyZ
Natknąłem się na ten sam problem, a potem przypomniałem sobie coś dziwnego na temat starszego projektu, nad którym pracowałem, i sposobu, w jaki rozwiązali ten problem. Wtedy tego nie rozumiałem i nie obchodziło mnie to, dopóki sam nie napotkałem problemu
Z jakiegoś powodu podanie daty jako „01 -02-2014” ustawia strefę czasową na zero i ignoruje strefę czasową użytkownika. Może to być przypadek w klasie Date, ale istniał jakiś czas temu i istnieje dzisiaj. Wydaje się, że działa w różnych przeglądarkach. Wypróbuj sam.
Ten kod jest wdrażany w globalnym projekcie, w którym strefy czasowe mają duże znaczenie, ale osoba przeglądająca datę nie przejmowała się dokładnym momentem jej wprowadzenia.
źródło
2014/5/31
i2014/05/31
jak Sat May 31 2014 00:00:00 GMT-0600 (Mountain Daylight Time (MDT) `jest mój bieżącej strefy czasowej). Z myślnikami ... wszystkie przeglądarki interpretują2014-05-31
jako piątek 30 maja 2014 18:00:00 GMT-0600 (górski czas letni). Co dziwne,2014-5-31
Chrome zwraca sobotę, Firefox zwraca piątek, a IE11 informuje, że data jest nieprawidłowa. Wygląda na to,date.replace('-','/')
że może załatwić sprawę.Sam
Date
obiekt i tak będzie zawierał strefę czasową, a zwrócony wynik jest efektem konwersji go na łańcuch w domyślny sposób. Oznacza to, że nie można utworzyć obiektu daty bez strefy czasowej. Ale to, co możesz zrobić, to naśladować zachowanieDate
obiektu, tworząc własny. Lepiej jednak przekazać to bibliotekom takim jak moment.js .źródło
proste rozwiązanie
źródło
Data w javascript jest po prostu prosta w środku. tak więc dane data-czas są przechowywane w epoce unix UTC (milisekundy lub ms).
Jeśli chcesz mieć „stały” czas, który nie zmienia się w żadnej strefie czasowej, w której się znajdujesz, możesz dostosować czas UTC, aby pasował do Twojej bieżącej lokalnej strefy czasowej i zapisać go. A kiedy go odzyskasz, niezależnie od Twojej lokalnej strefy czasowej, w której się znajdujesz, pokaże skorygowany czas UTC na podstawie tego, który go zapisał, i doda lokalne przesunięcie strefy czasowej, aby uzyskać „stały” czas.
Aby zapisać datę (w ms)
Aby pobrać / pokazać datę (w ms)
Następnie możesz:
źródło
Możesz użyć tego kodu
źródło
Ponieważ jest to naprawdę problem z formatowaniem podczas wyświetlania daty (np. Wyświetla się w czasie lokalnym), lubię używać nowego (ish) obiektu Intl.DateTimeFormat do formatowania, ponieważ jest bardziej wyraźny i zapewnia więcej opcji wyjściowych:
Jak pokazano, ustawienie TimeZone na „UTC” nie spowoduje wykonania lokalnych konwersji. Jako bonus umożliwia również tworzenie bardziej dopracowanych wyników. Więcej o obiekcie Intl.DateTimeFormat można przeczytać w witrynie Mozilla - Intl.DateTimeFormat .
Edytować:
Tę samą funkcjonalność można osiągnąć bez tworzenia nowego
Intl.DateTimeFormat
obiektu. Po prostu przekaż opcje lokalizacji i daty bezpośrednio dotoLocaleDateString()
funkcji.źródło
Tylko ogólna notatka. sposób na zachowanie elastyczności.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Możemy użyć getMinutes (), ale zwraca ona tylko jedną liczbę przez pierwsze 9 minut.
źródło
(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")
To da wynik: wtorek 10 lipca 2018 19:07:11
(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")
To da wynik: piątek 08 lipca 2005 04:22:33
Uwaga: Zwrócony czas będzie zależał od lokalnej strefy czasowej
źródło
To jest rozwiązanie, które wymyśliłem na ten problem, które działa dla mnie.
użyta biblioteka: momentjs ze zwykłą klasą Date w javascript.
Krok 1. Konwertuj obiekt Date na moment (PS: moment zachowuje oryginalną datę i czas, o ile
toDate()
metoda nie jest wywoływana):const dateMoment = moment("2005-07-08T11:22:33+0000");
Krok 2. Wyodrębnij
hours
iminutes
wartości z utworzonego wcześniej obiektu momentu:Krok 3. Konwertuj moment na datę (PS: spowoduje to zmianę oryginalnej daty w oparciu o strefę czasową przeglądarki / komputera, ale nie martw się i przeczytaj krok 4.):
Krok 4. Ręcznie ustaw godziny i minuty wyodrębnione w kroku 2.
Krok 5.
dateObj
pokaże teraz oryginalną datę bez różnicy w strefie czasowej. Nawet zmiany czasu letniego nie będą miały żadnego wpływu na obiekt daty, ponieważ ręcznie ustawiamy oryginalne godziny i minuty.Mam nadzieję że to pomoże.
źródło
Istnieją pewne nieodłączne problemy z analizowaniem dat, które niestety nie są domyślnie rozwiązane.
-Daty czytelne dla człowieka mają ukrytą strefę czasową
-Istnieje wiele powszechnie używanych formatów dat w Internecie, które są niejednoznaczne
Aby rozwiązać te problemy w łatwy i czysty sposób, potrzebna byłaby taka funkcja:
Szukałem tego, ale nic takiego nie znalazłem!
Więc stworzyłem: https://github.com/zsoltszabo/timestamp-grabber
Cieszyć się!
źródło