2012-09-16 71 views
1

我想將日期對象轉換爲與「Google電子表格」中所用日期的基礎值一致的「序列號」。我的理解是,在Javascript中,日期對象的原始值是1970年1月1日午夜之後(或之前)的毫秒數;在Google Spreadsheets中,日期的原始值在1899年12月30日午夜爲0(零),此後每天等於1(例如,7小時等於7除以24)。Google Apps腳本中的時區

我嘗試這個功能:

function date2Serial(date) { 
    return (date.getTime() + 2209161600000)/86400000; 
    // 2209161600000 = milliseconds between 1899-12-30 and 1970-01-01 
    // 86400000 = milliseconds in a day 
    // question "on the side" - is there any essential difference between 
    // .getTime() and .valueOf()? 
} 

而這個返回的值是有點過 - 我認爲「斷」與GMT我的時差對應。因此,即使在我的情況下,電子表格設置和項目屬性都設置爲GMT + 10,但似乎getTime()在GMT上運行。

因此,例如:

A1: 16/09/2012 06:00:00 
A2: =date2serial(A1) 
A3: =VALUE(A1) 

A2返回41167.8333,其中A3返回41168.25。

現在我嘗試使用getTimezoneOffset()方法,這似乎糾正問題:

function date2Serial(date) { 
    return (date.getTime() + 2209161600000 - (date.getTimezoneOffset() * 60000))/86400000; 
} 

然而,這依賴於項目屬性時區是正確的,而不是在電子表格設置時區(它實際上是可以設置每個這些不同)。

我的問題:

這種行爲是預期,而「調整」時間區有必要嗎?或者,getTime()(以及所有其他方法(如getHours(),getMinutes()等))在用戶設置的時區而不是GMT/UTC上運行,而「調整」實際上是解決錯誤的方法?

回答

2

getTime()返回一個持續時間,而不是時間,因此沒有時區。減去的參考時刻是1970年1月1日午夜(UTC)。

像getHours(),getMinutes()等方法給時間的一部分。結果取決於所使用的日期對象的時區。如果你想獨立於日期對象的時區,你應該使用getUTCHours(),getUTCMinutes()等等。

+0

Thanks + Taras,這非常有幫助。我意識到,現在getTime()將在1970年1月1日午夜_UTC_爲零,在Google Spreadsheets中,零值對應於1899年12月30日午夜 - 無論電子表格在任何時區設置爲 - - 一個本質區別。 – AdamL