2016-03-08 28 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

相关问题