Czy obiekt Javascript date jest zawsze jeden dzień wolny?
W mojej aplikacji Java Script mam datę zapisaną w formacie tak:
2011-09-24
Teraz, gdy próbuję użyć powyższej wartości, aby utworzyć nowy obiekt daty (aby móc pobrać datę w innym formacie), Data zawsze wraca jeden dzień wolny. Patrz poniżej:
var doo = new Date("2011-09-24");
console.log(doo);
Logi:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
15 answers
Zwróć uwagę, że Wschodni czas letni jest -4 hours
i że godziny w dniu powrotu są 20
.
20h + 4h = 24h
/ 2011-09-24 19: 00: 00
Dostajesz właściwą datę, po prostu nigdy nie określiłeś właściwej strefy czasowej.
Jeśli potrzebujesz dostępu do wartości daty, Możesz użyć getUTCDate()
lub dowolnej z pozostałych funkcji getUTC*()
:
var d,
days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 18:04:35
Istnieje kilka szalonych rzeczy, które dzieją się z obiektem JS DATE, które konwertują łańcuchy, na przykład rozważ następującą datę, którą podałeś
Uwaga: poniższe przykłady mogą lub nie mogą być jeden dzień wolny w zależności od twojej strefy czasowej i aktualnego czasu.
new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
Jeśli jednak zmienimy format łańcucha znaków na Miesiąc-Dzień-Rok...
new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Kolejny dziwny one
new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.
new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Możemy łatwo zmienić myślniki w Twojej dacie "2011-09-24" przy tworzeniu nowej daty
new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Co by było gdybyśmy mieli ciąg daty Jak "2011-09-24t00:00:00"
new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
Teraz zmień myślnik na ukośnik do przodu jak wcześniej; co się dzieje?
new Date("2011/09/24T00:00:00");
// => Invalid Date
Zazwyczaj muszę zarządzać formatem daty 2011-09-24t00:00:00 więc to jest to, co zrób.
new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
UPDATE
Jeśli podasz osobne argumenty konstruktora daty, możesz uzyskać inne użyteczne wyniki, jak opisano poniżej
Uwaga: argumenty mogą być typu Number lub String. Pokażę przykłady z wartościami mieszanymi.
Pobierz pierwszy miesiąc i dzień danego roku
new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)
Pobierz ostatni miesiąc i dzień roku
new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)
Przykład liczby, Argumenty łańcuchowe. Zauważ, że miesiącem jest Marzec, ponieważ miesiące oparte na zero ponownie.
new Date(2011, "02");
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)
Jeśli zrobimy to samo, ale z dniem zerowym, otrzymamy coś innego.
new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)
Dodanie dnia zerowego do dowolnego argumentu year and month spowoduje otrzymanie ostatniego dnia poprzedniego miesiąca. Jeśli kontynuujesz z liczbami ujemnymi, możesz cofnąć się o kolejny dzień
new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 20:22:55
Aby znormalizować datę i wyeliminować niechciane przesunięcie (testowane tutaj: https://jsfiddle.net/7xp1xL5m/ ):
var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) ) );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)
To również osiąga to samo i zasługa @tpartee (testowane tutaj: https://jsfiddle.net/7xp1xL5m/1/ ):
var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 ) );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 00:10:43
Jeśli chcesz uzyskać godzinę 0 pewnej daty w lokalnej strefie czasowej, przekaż poszczególne części daty do konstruktora Date
.
new Date(2011,08,24); // month value is 0 based, others are 1 based.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 14:37:14
Chcę tylko dodać, że widocznie dodanie spacji na końcu łańcucha użyje UTC do utworzenia.
new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)
new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)
Edit: to nie jest zalecane rozwiązanie, tylko alternatywna odpowiedź. Proszę nie stosować tego podejścia, ponieważ jest bardzo niejasne, co się dzieje. Istnieje wiele sposobów, w jaki ktoś mógłby przefaktorować to przypadkowo powodując błąd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 16:25:34
Myślę, że ma to związek z regulacją strefy czasowej. Data, którą utworzyłeś, to GMT, a domyślnym czasem jest północ, ale Twoja strefa czasowa to EDT, więc odejmuje 4 godziny. Spróbuj to sprawdzić:
var doo = new Date("2011-09-25 EDT");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 14:26:30
Twój problem dotyczy strefy czasowej. Uwaga Część GMT-0400
- czyli jesteś 4 godziny za GMT. Jeśli dodasz 4 godziny do wyświetlonej daty/godziny, otrzymasz dokładnie północ 2011/09/24. Zamiast tego użyj metody toUTCString()
, aby uzyskać łańcuch GMT:
var doo = new Date("2011-09-24");
console.log(doo.toUTCString());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 14:27:58
To przeze mnie dla pętli ,+ 1 na odpowiedź zzzbova. Oto pełna konwersja daty, która działała dla mnie przy użyciu metod UTC:
//myMeeting.MeetingDate = '2015-01-30T00:00:00'
var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!
myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 17:25:11
Oznacza 2011-09-24 00:00:00 GMT
, a skoro jesteś w GMT -4
, to będzie to 20:00
poprzedniego dnia.
Osobiście dostaję 2011-09-24 02:00:00
, ponieważ mieszkam w GMT +2
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 14:25:57
To prawdopodobnie nie jest dobra odpowiedź, ale po prostu chcę podzielić się moim doświadczeniem z tym problemem.
Moja aplikacja jest globalnie używać utc data w formacie "RRRR-MM-DD", podczas gdy wtyczka datepicker używam tylko zaakceptować datę js, trudno mi rozważyć zarówno utc i js. Kiedy więc chcę przekazać sformatowaną datę "RRRR-MM-DD" do mojego datepickera, najpierw konwertuję ją do formatu "MM/DD/RRRR" używając moment.js czy jak chcesz, a data pokazana na datepicker jest teraz poprawna. Dla Twojego przykład
var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale
Najwyraźniej d1 jest tym, czego chcę. Mam nadzieję, że to będzie pomocne dla niektórych ludzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 15:01:34
Chociaż w przypadku OP Strefa czasowa to EDT, nie ma gwarancji, że użytkownik wykonujący Twój skrypt będzie w strefie czasowej EDT, więc kodowanie offsetu niekoniecznie będzie działać. Znalezione rozwiązanie dzieli łańcuch daty i używa oddzielnych wartości w konstruktorze daty.
var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
Zauważ, że musisz uwzględnić kolejny kawałek js dziwactwa: miesiąc jest oparty na zero.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 18:45:20
Najlepszy sposób, aby poradzić sobie z tym bez użycia większej liczby metod konwersji,
var mydate='2016,3,3';
var utcDate = Date.parse(mydate);
console.log(" You're getting back are 20. 20h + 4h = 24h :: "+utcDate);
Teraz wystarczy dodać GMT w swojej dacie lub można dołączyć go.
var mydateNew='2016,3,3'+ 'GMT';
var utcDateNew = Date.parse(mydateNew);
console.log("the right time that you want:"+utcDateNew)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 06:17:54
Używasz formatu ISO date string, który zgodnie z Ta strona powoduje, że data jest konstruowana przy użyciu strefy czasowej UTC:
Uwaga: parsowanie łańcuchów daty za pomocą konstruktora daty (oraz Data.parse, są równoważne) jest zdecydowanie odradzany ze względu na różnice i niespójności w przeglądarce. Obsługa formatu RFC 2822 ciągi są tylko w konwencji. Obsługa formatów ISO 8601 różni się że tylko ciągi daty (np. "1970-01-01") są traktowane jako UTC, Nie lokalne.
Jeśli sformatujesz tekst inaczej, na przykład "Jan 01 1970"
, to (przynajmniej na moim komputerze) używa on lokalnej strefy czasowej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 21:23:55
Następujący podział dla mnie -
var doo = new Date("2011-09-24").format("m/d/yyyy");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-15 16:44:32
nevermind, nie zauważyłem GMT -0400, co powoduje, że data jest wczoraj
Możesz spróbować ustawić domyślny "czas" na 12: 00: 00
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 14:25:38