2016-03-08 50 views
3

我想創建一個新的日期對象初始化爲從另一個函數傳入的日期。該方案將事先不知道所需的日期,但是我們要說的日期是1月1日,2017年當我使用變量而不是整數或字符串時,爲什麼初始化日期對象失敗?

成功:

var newYear = new Date(2017, 0, 1); 
Logger.log(newYear.toISOString()); 
//logs 2017-01-01T08:00:00.000Z 

不成功:

var date = "2017, 0, 1"; 
var newYear = new Date(date); 
Logger.log(newYear.toISOString()); 
//throws "Error, date range is invalid." 

不成功:

var date = "2017-0-1"; 
var newYear = new Date(date); 
Logger.log(newYear.toISOString()); 
//throws "Error, date range is invalid." 

編輯:就在發佈之前,我想通了。我希望沒有人介意我發佈和回答我自己的問題 - 也許你可以更好地回答它!

+0

請注意,強烈建議使用Date構造函數來解析字符串。總是手動解析字符串,庫可以提供幫助,但通常不需要,因爲2或3行函數就足夠了。 – RobG

+0

當你談論手動解析字符串時,你的意思是像我下面給出的解決方案,還是我誤解了你? –

+0

是的。請注意,對於ISO 8601僅限日期的字段,某些瀏覽器會將它們解析爲本地,有些則爲UTC(有些會根據UTC版本改變主意),有些瀏覽器根本不會解析它們,因此手動是唯一方法。一個庫可以提供幫助,但它可以通過3行驗證進行解析(不含混淆)。 – RobG

回答

2

即使字符串看起來像一系列用逗號分隔的整數,即使Javascript是鬆散類型的語言,它們也不相同。

解決方案:

var year = 2017; 
var month = 0; //don't forget months go from 0-11 
var day = 1; 
var newYear = new Date(year, month, day); 
Logger.log(newYear.toISOString()); 
//logs 2017-01-01T08:00:00.000Z 

要在 「2017年3月4日」 的形式分析日期:

var givenDate = "2017-3-04" 
var date = givenDate.split("-"); 
var Year = date[0]; 
var Month = date[1]-1; 
var Day = date[2]; 
var newYear = new Date(Year, Month, Day); 
Logger.log(newYear.toISOString()); 
//logs 2017-01-01T08:00:00.000Z 

注:在您的本地時區輸出日期,而不是「 toISOString()「,它將時間報告爲GMT/ISO時間(在大多數瀏覽器上),您可以使用」toDateString()「輸出一個更具可讀性的表單,它反映了當地時區。

+0

請注意,雖然這個解析日期爲本地(這是根據ISO 8601),使用* toISOString *的輸出可能會顯示不同的日期它始終是UTC,用戶可能不是。對於格林威治以東的用戶,日期將提前一天,例如對於UTC + 0500,2017-01-01將轉換爲2017-01-01T00:00:00 + 0500(本地),即2016-12-31T19:00:00Z(即* toISOString *顯示意外日期,因爲它是使用不同的時區)。 – RobG

相關問題