【发布时间】:2016-03-31 21:29:00
【问题描述】:
在Google reference documentation 中,我找到了一个将 RFC3339 日期字符串转换为有效日期对象的简短函数。代码非常简单,如下所示:
function parseDate(string) {
var parts = string.split('T');
parts[0] = parts[0].replace(/-/g, '/');
return new Date(parts.join(' '));
}
问题是它不起作用。(我很惊讶他们发布了一个不起作用的代码......我错过了什么吗?)
我在使用 JSON 对日期进行字符串化和解析时也遇到了问题,因为 JSON 方法返回一个 UTC 值(最后是一个 Z),因此我丢失了时区信息。 Google 的代码也不处理这个问题(即使它有效)。
下面是我用来测试它的演示代码和我为得到我想要的东西而编写的解决方案。不确定它是否非常有效或写得好,但至少我得到了我想要的结果(我在设置为 GMT+2,比利时夏令时的脚本中执行此代码)。 我愿意接受任何改进此代码的建议。(这将是这个问题的主题)
我在代码中添加了很多日志和cmets,以使其尽可能清晰:
function testJSONDate() {
Logger.log('starting value : "2016/3/31 12:00:00"');
var jsDate = JSON.stringify(new Date("2016/3/31 12:00:00"));// time is 12:00 I'm in GMT+2
Logger.log('JSON.stringify value : '+jsDate);
Logger.log('JSON parse jsDate : '+JSON.parse(jsDate)); // time is 10:00, UTC
var jsDateWithoutQuotes = jsDate.replace(/"/,'');
var date = parseDate(jsDateWithoutQuotes);
Logger.log('parsed RFC3339 date using Google\'s code : '+date); // does not return a valid date
var otherFunction = parseDate2(jsDateWithoutQuotes);
Logger.log('parsed RFC3339 date using other code : '+otherFunction); // does return a valid date in my TZ
}
function parseDate(string) {
var parts = string.split('T');
parts[0] = parts[0].replace(/-/g, '/');
return new Date(parts.join(' '));
}
function parseDate2(string) {
var refStr = new Date().toString();
var fus = Number(refStr.substr(refStr.indexOf('GMT')+4,2));
Logger.log('TZ offset = '+fus);
var parts = string.split('T');
parts[0] = parts[0].replace(/-/g, '/');
var t = parts[1].split(':');
return new Date(new Date(parts[0]).setHours(+t[0]+fus,+t[1],0));
}
在第一个答案后编辑
在代码稍作改动后,我设法让 Google 的 sn-p 工作,但由于 JSON 转换 JS 日期对象的方式,时区丢失的问题仍然存在。
下面的新代码和记录器结果:
function testJSONDate() {
Logger.log('starting value : 2016/3/31 12:00:00');
var jsDate = JSON.stringify(new Date("2016/3/31 12:00:00"));// time is 12:00 I'm in GMT+2
Logger.log('JSON.stringify value : '+jsDate);
Logger.log('JSON parse jsDate : '+JSON.parse(jsDate)); // time is 10:00, UTC
var jsDateWithoutQuotesAndMillisecAndZ = jsDate.replace(/"/g,'').split('.')[0];
Logger.log('jsDateWithoutQuotesAndMillisecAndZ = '+jsDateWithoutQuotesAndMillisecAndZ);
var date = parseDate(jsDateWithoutQuotesAndMillisecAndZ);
Logger.log('parsed RFC3339 date using Google\'s code : '+date); // does not return a valid date
var otherFunction = parseDate2(jsDateWithoutQuotesAndMillisecAndZ);
Logger.log('parsed RFC3339 date using other code : '+otherFunction); // does return a valid date in the right tz
}
【问题讨论】: