2013-04-18 13 views
10

Rozważmy następujący kod HTML + JavaScript:Problem z .toISOString function()

<!DOCTYPE html> 
<html> 
<body> 

<p id="demo">Click the button to display a date after changing the hours, minutes, and seconds.</p> 

<button onclick="myFunction()">Try it</button> 
<script> 
function myFunction() 
    { 
    var d = new Date(); 
    d.setHours(0,0,0,0); 
    document.write(d + '<br/>'); 
    document.write('ISO Date '+ d.toISOString() + '<br/>'); 
    //I want it to be 2013-04-17T00:00:00.000Z 
    } 
</script> 
</body> 
</html> 

Output:

Thu Apr 18 2013 00:00:00 GMT+0530 (India Standard Time) 
ISO Date 2013-04-17T18:30:00.000Z 

Czy ktoś może pomóc w zrozumieniu tej różnicy w Date & Czas

Odpowiedz

25
var d = new Date(); 
d.setHours(-12, d.getTimezoneOffset(), 0, 0); //removing the timezone offset and 12 hours 
console.log(d.toISOString()); //2013-04-17T00:00:00.000Z 

Nie wiem, dlaczego trzeba datę ISO dzień wcześniej, ale w przypadku, gdy jest to literówka:

var d = new Date(); 
d.setHours(0, -d.getTimezoneOffset(), 0, 0); //removing the timezone offset. 
console.log(d.toISOString()); //2013-04-18T00:00:00.000Z 
+0

W drugim przykładzie, uważam, że powinno to być 'd.getTimezoneOffset()'. Przesunięcie może być ujemne lub dodatnie. Negacja spowoduje dodanie, jeśli wartość jest ujemna. – dbasch

+0

@dbasch to jest punkt. Jeśli wartość jest ujemna, jesteś ** za ** UTC0, więc musisz dodać godziny do czasu lokalnego. –

3
2013-18-04 00:00:00 GMT+0530 
2013-17-04 18:30:00 GMT+0000 

To są dwa znaczniki czasu. Pierwszy ma strefę czasową, drugi to GMT (bez regulacji strefy czasowej). Jeśli weźmiesz drugi znacznik czasu i dodasz 05:30:00 do 18:30:00, otrzymasz północ następnego dnia. To pasuje do pierwszego znacznika czasu.

+1

Warto odnotować komentarz w ramach kodu OP: '// Chcę, aby był 2013-04-17T00: 00: 00.000Z'. Myślę, że on szuka sposobu, aby zapobiec konwersji .toOSOString() z GMT + 0530 na GMT + 0000. –

+0

@JamesDonnelly: Masz rację ... Dostałem odpowiedź od Artema Neustroeva, tzn. Usunięto przesunięcie strefy czasowej. w każdym razie dzięki wszystkim za Twój czas. –

+0

Te przyrostki "GMT" nie są strefami czasowymi, ale przesunięciami. Nie mówią nic o dostosowywaniu czasu letniego. – Suncat2000

1

Ponadto można usunąć strefę czasową tak:

let birthday = new Date(this.profile.birthday + ' UTC').toISOString();