我想將日期對象轉換爲與「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上運行,而「調整」實際上是解決錯誤的方法?
Thanks + Taras,這非常有幫助。我意識到,現在getTime()將在1970年1月1日午夜_UTC_爲零,在Google Spreadsheets中,零值對應於1899年12月30日午夜 - 無論電子表格在任何時區設置爲 - - 一個本質區別。 – AdamL