2015-12-10 73 views
0

在谷歌腳本我有以下代碼:Utilities.formatDate返回錯誤的週數

var myDate = new Date(sheet.getRange(3,1).getValue()); 
var year = Utilities.formatDate(myDate, "Europe/Amsterdam", 'dd-MM-yyyy'); 
var weekyear = Utilities.formatDate(myDate, "Europe/Amsterdam", 'dd-MM-YYYY'); 
var week = Utilities.formatDate(myDate, "Europe/Amsterdam", 'w'); 

當我插入30-12-2015日期,結果將是。

// year: 30-12-2015 
// weekyear: 30-12-201**6** 
// week: 1 

在我的本地時區,應該是週數53不是1 如果我calculate the week in ISO 8601,結果是52

奇怪,不是嗎?

編輯: 新的嘗試,與此代碼

var cursus_datum = sheet.getRange(3,1).getValue(); 
    Logger.log('type of data: ' + typeof cursus_datum); 
    Logger.log(cursus_datum); 
    Logger.log(Utilities.formatDate(cursus_datum, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "d-MM-y HH:mm")); 
    Logger.log(Utilities.formatDate(cursus_datum, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "w")); 

這導致

// type of data: object 
// Wed Dec 30 09:00:00 GMT+01:00 2015 
// 30-12-2015 00:00 which is perfect 
// 1 which is **not** correct. 

錯誤的一週的bug。

回答

2

Utilities.formatDate documentation狀態,它使用Java的SimpleDateFormat - 我有一種感覺,這可能是問題的原因,因爲它們是語言環境敏感,我想借此將採用猜測默認的美國語言環境(我不認爲通過時區更改語言環境)。問題是美國本地日曆有getFirstDayOfWeek() = 1 (SUNDAY)getMinimalDaysInFirstWeek() = 1。而對於ISO 8601,則分別需要設置2和4。我認爲如果你想與週年一起工作,你最好堅持使用你鏈接的Javascript代碼。

+0

如果我使用鏈接到的JavaScript代碼,我得到了第52周的結果,而它應該是53.奇怪的是沒有人似乎有這個錯誤。 –

+0

這[jsfiddle](https://jsfiddle.net/4926k18q/4/)的輸出是否正確? – Daniel

+0

它應該這樣做。接下來,您可以簡單地將這些額外的日期方法複製到您自己的Google Apps Script .gs文件中(將它們放在頂層,而不是放在任何其他功能中),並在小提琴中使用它們。 – Daniel

1

new Date()將接受幾個不同的參數配置,但您仍然需要確保參數是正確的。你不能只插入任何東西new Date()如果變量已經是日期類型,那麼使用new Date()就沒有意義。您可以使用typeof測試數據類型。

var dateFromSheet = sheet.getRange(3,1).getValue(); 
Logger.log('type of data: ' + typeof dateFromSheet); 

如果數據類型是字符串,它必須是一個有效的日期字符串格式。有幾種不同的格式。但是,再次,您需要使用有效的格式。

  • ISO 8601語法 「YYYY-MM-DD」 或 「YYYY-MM」 或 「YYYY」 或 「YYYY-MM-DDTHH:MM:SS」
  • 長日期語法 - 年,月,日可以以任何順序:「2015年3月7日」或「2015年3月7日」,月份可以全部寫入:「2015年3月7日」
  • 可以使用短日期 - 「/」或「 - 」。 「MM/DD/YYYY」或「YYYY/MM/DD」注意:您不能使用「DD/MM/YYYY」
  • 完整日期格式 - 「Wed Mar DD DD YYYY HH:MM:SS GMT + 0100 (西歐標準時間)」
+0

我改變了我的帖子,並添加了你的方法。但是,我不再有日,月或年的問題了。但是這周仍然是一個問題。 事實上,不要使用YYYY,因爲那樣你會得到與本週相關的年份。而且因爲這一週是錯的,你會得到錯誤的一年。 –