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)
Author: Martin Thoma, 2011-09-26

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()]);
 73
Author: zzzzBov,
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)
 147
Author: SoEzPz,
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 )  );
 54
Author: AaronLS,
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.
 25
Author: lincolnk,
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.

 18
Author: Kyle Shrader,
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");
 14
Author: FishBasketGordo,
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());
 10
Author: Aleks G,
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!
 5
Author: cmartin,
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.

 4
Author: pimvdb,
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.

 3
Author: Jie Zhang,
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.

 2
Author: Brian Risk,
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)

Live: https://jsfiddle.net/gajender/2kop9vrk/1/

 0
Author: Gajender Singh,
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.

 0
Author: PaulrBear,
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");
 -2
Author: Venu,
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

 -3
Author: ChrisH,
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