gpt4 book ai didi

google-apps-script - Google Apps 脚本和 RFC 3339 问题

转载 作者:行者123 更新时间:2023-12-01 04:57:07 25 4
gpt4 key购买 nike

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),因此我丢失了时区信息。谷歌的代码也没有处理这个问题(即使它有效)。

下面是我用来测试它的演示代码和我编写的解决方案以获得我想要的。不确定它是不是非常有效,也不是写得很好,但至少我得到了我想要的结果(我在设置为 GMT+2,比利时夏令时的脚本中执行此代码)。
我愿意接受任何改进此代码的建议。(这将是这个问题的主题)

我在代码中添加了很多日志和注释,以使其尽可能清晰:
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));
}

记录器结果:
enter image description here

编辑以下第一个答案

在对代码稍作更改后,我设法使 Google 的代码段起作用,但由于 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
}

enter image description here

最佳答案

您脱离了上下文使用了一些辅助函数。它只是作为一种权宜之计让特定 API ( Google Calendar API ) 返回的字符串在 Apps 脚本中正确解析。它不是任何一种通用日期转换器。当filing an issue时,一个项目成员把它扔在一起,并且该线程中的后续消息指出了该函数未处理的另一个细节。

截至目前,Apps Script 中的日期解析器可以正确解析以下格式:

function testdate() {
Logger.log(new Date("2016/03/31 10:00:00")); // local time
Logger.log(new Date("2016/03/31 10:00:00 +2:00")); // with given offset
Logger.log(new Date("2016-03-31T08:00:00.000Z")); // in UTC
}

请注意,UTC 时间戳需要毫秒,但其他时间戳则不允许。

您对需要解析但不是上述字符串之一的日期时间字符串执行的操作取决于其格式。如果您有 2016-03-31T10:00:00 (显然,这是 Google Calendar API 返回的内容)并且这意味着在本地时间,那么您需要引用的解析函数所做的事情:用空格替换 T 和 - 替换/。如果同一个字符串代表UTC时间,则需要加上 .000Z在末尾。等等。

关于google-apps-script - Google Apps 脚本和 RFC 3339 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36344156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com