我正在获取一个json feed,其日期字符串的格式如下:
// 2012-08-03T23:00:26-05:00
我以为我可以把它传递到一个新的日期
var dt = new Date("2012-08-03T23:00:26-05:00");
这适用于jsfiddle,但不适用于谷歌脚本。它返回一个无效的日期。阅读this post后,我认识到可能是GAS如何解释日期字符串,所以现在我不知道如何重新格式化日期以使其有效。
是否有最佳方式重新格式化该日期字符串,以便GAS将其识别为日期?
答案 0 :(得分:20)
Google Apps脚本使用特定版本的JavaScript(ECMA-262 3rd Edition),因为您发现无法解析ISO 8601格式的日期/时间。下面是我在许多应用程序脚本中使用的修改函数
var dt = new Date(getDateFromIso("2012-08-03T23:00:26-05:00"));
// http://delete.me.uk/2005/03/iso8601.html
function getDateFromIso(string) {
try{
var aDate = new Date();
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?" +
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));
var offset = 0;
var date = new Date(d[1], 0, 1);
if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
return aDate.setTime(Number(time));
} catch(e){
return;
}
}
答案 1 :(得分:7)
找到了其他可能且非常简单的代码,似乎也可以完成这项工作:
function test(){
Logger.log(isoToDate("2013-06-15T14:25:58Z"));
Logger.log(isoToDate("2012-08-03T23:00:26-05:00"));
Logger.log(isoToDate("2012-08-03T23:00:26+05:00"));
}
function isoToDate(dateStr){// argument = date string iso format
var str = dateStr.replace(/-/,'/').replace(/-/,'/').replace(/T/,' ').replace(/\+/,' \+').replace(/Z/,' +00');
return new Date(str);
}
答案 2 :(得分:1)
如果预先知道格式,那么使其工作的艰难且可靠的镜头方法是解析它。
var dtString = "2012-08-03T23:00:26-05:00";
var date = dtString.split('T')[0];
var time = dtString.split('T')[1].split('-')[0];
var tz = dtString.split('T')[1].split('-')[1];
var dt = new Date(date.split('-')[0] , date.split('-')[1] - 1, // month is special
date.split('-')[2], time.split(':')[0],
time.split(':')[1], time.split(':')[2] , 0);
我没有测试过这段确切的代码,但使用了类似的代码。因此,这可以让您对如何继续进行公平的了解。
答案 3 :(得分:1)
在Google脚本中将日期字符串转换为日期对象时,这对我有用。
日期字符串是通过getValue s ()方法从Google图纸单元格中获取的。
从:01.01.2017 22:43:34
到:2017/01/01 22:43:34
完成了这项工作。然后是new Date()
。
var dateTimeObj = new Date(stringDate.replace(/^(\d{1,2})[-.](\d{1,2})[-.](\d{4})/g,"$3/$2/$1"));
答案 4 :(得分:0)
到目前为止new Date()
似乎可以正常工作:
var dT = new Date("2012-08-03T23:00:26-05:00");
console.info("dT: %s or %d", dT, dT.getTime());
在Google Apps脚本中返回dT: Sat Aug 04 06:00:26 GMT+02:00 2012 or 1.344052826E12