2013-04-18 64 views
10

考慮下面的代碼的HTML + JavaScript的:問題與.toISOString()函數

<!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> 

輸出

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

任何人都可以在日期理解這種差異&時間幫助

回答

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 

我不知道,你爲什麼會需要一個ISO日期提前了一天,但如果它是一個錯字:

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

在第二個例子中,我認爲它應該是'd.getTimezoneOffset()'。偏移量可以是負值或正值。如果該值爲負值,否定將會創建一個附加值。 – dbasch

+0

@dbasch這就是要點。如果這個值是負值,那麼你** ** ** UTC0之後,所以你需要在當地時間添加小時。 –

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

這是兩個時間戳。第一個有時區,第二個是GMT(沒有時區調整)。如果您拿到第二個時間戳並將05:30:00添加到18:30:00,您將獲得第二天的午夜。這匹配第一次的時間戳。

+1

值得注意OP的代碼中的註釋:'//我希望它是2013-04-17T00:00:00.000Z'。我想他正在尋找一種方法來防止'.toISOString()'從GMT + 0530轉換爲GMT + 0000。 –

+0

@JamesDonnelly:你是對的......我從Artyom Neustroev得到了答案,即刪除了時區偏移量。任何方式感謝大家的時間 –

+0

那些「GMT」後綴不是時區,但偏移量。他們沒有告訴你夏令時調整。 – Suncat2000

1

您也可以刪除時區是這樣的:

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