Utilities formatDate 不支持 GMT... 参数的假设不成立。
您在参考中提到的帖子用于获取日历事件,当您从另一个夏令时获取事件(从日历事件本身获取 TZ 信息)时,它是一种获得正确值的有用方法,例如事件下个月将是“夏令时”,而我们仍处于“冬令时”......
您的问题可能来自不同的来源,具体取决于脚本的时区设置与来源的时区。你能描述一下你使用这个脚本的确切配置吗?
同时,这里有一个小代码演示了代码是如何工作的 + 记录器结果:
function testOnSubmit() {
var eventInfo = {};
var values = {};
values['3'] = new Date();
eventInfo['values'] = values;
Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n\n');
onSubmit(eventInfo);
}
function onSubmit(e) {
var values = e.values;
try {
var start1 = new Date(values[3]);
Logger.log('onSubmit log results : \n');
Logger.log('start1 = '+start1)
var startN = new Date(start1).toString().substr(25,6)+"00";
Logger.log('startN = '+startN);
var startT = Utilities.formatDate(start1, startN, "h:mm a");
Logger.log('result in timeZone = '+startT);
} catch(error) {
Logger.log(error);
}
}
编辑:另外,关于 30 和 45' 的偏移,这可以通过像这样更改子字符串长度来轻松解决:
var startN = new Date(start1).toString().substr(25,8);
结果是一样的,几年前我不得不使用另一个版本,因为谷歌在某个时候更改了 Utilities.formatDate 方法 (issue 2204),但这已得到修复。
EDIT 2 : 在同一主题上,两种方法实际上返回相同的结果,GMT 字符串的唯一优点是您不必知道确切的时区名称...还有Session.getScriptTimeZone() 方法。下面是一个演示脚本,显示了 1 月和 7 月 2 个日期的结果以及日志结果:
function testOnSubmit() {
var eventInfo = {};
var values = {};
values['3'] = new Date(2014,0,1,8,0,0,0);
eventInfo['values'] = values;
Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n\n');
onSubmit(eventInfo);
values['3'] = new Date(2014,6,1,8,0,0,0);
eventInfo['values'] = values;
Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n');
onSubmit(eventInfo);
}
function onSubmit(e) {
var values = e.values;
var start1 = new Date(values[3]);
Logger.log('onSubmit log results : ');
Logger.log('start1 = '+start1)
var startN = new Date(start1).toString().substr(25,8);
Logger.log('startN = '+startN);
Logger.log('result in timeZone using GMT string = '+Utilities.formatDate(start1, startN, "MMM,d h:mm a"));
Logger.log('result in timeZone using Joda.org string = '+Utilities.formatDate(start1, 'Europe/Brussels', "MMM,d h:mm a"));
Logger.log('result in timeZone using Session.getScriptTimeZone() = '+Utilities.formatDate(start1, Session.getScriptTimeZone(), "MMM,d h:mm a")+'\n');
}
还要注意,Logger 有自己的方式来显示日期对象的值!它使用 ISO 8601 时间格式,即 UTC 值。