我使用谷歌Apps脚本与谷歌的形式。 当用户提交的谷歌表格我从一个问题的值。 然后我采取这一价值并使其约会对象,从我在这看到了一篇关于夏令我用它来确定的时区。 我贯穿Utilities.formatDate Date对象,并希望得到正确格式的日期。
例如:上午9:00
而是我得到比预期完全不同的时间。
我的问题是:是否有人可以帮助我了解为什么下面的代码输出时间为3小时不同?
function onSubmit(e) {
var values = e.values;
Logger.log(values);
try {
var start1 = new Date(values[3]);
var startN = new Date(start1).toString().substr(25,6)+"00";
var startT = Utilities.formatDate(start1, startN, "h:mm a");
Logger.log(startT);
} catch(error) {
Logger.log(error);
}
}
公用事业formatDate不支持GMT假设...参数是不正确的。
你参考提到的职位是用来获取日历事件,是一个非常有用的方式,当你从另一个夏令时(正从日历事件本身的TZ资讯)事件,以得到正确的值,为下月例如事件将在“夏令时间”,而我们仍处于“冬天的时候” ......
这取决于你的脚本VS源的时区的时区设置你的问题可能来自不同的来源。 你能描述在你使用这个脚本的具体配置?
与此同时,这里是一个演示代码是如何工作的+记录结果一个小代码:
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方法几年前使用其他版本的问题,2204 ),但是这已得到修复。
编辑2:在同一个主题,这两种方法实际上返回相同的结果,GMT字符串只有你不必知道确切的时区名称的优势...还有的Session.getScriptTimeZone()
方法。 下面是一个演示脚本,显示在一月份和7月2日与日期日志结果沿着resulst:
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');
}
还要注意的是,记录仪有其自己的方式来显示日期对象的值! 它采用ISO 8601时间格式为UTC值。
试试这个:
var timeZone = Session.getScriptTimeZone();
var startT = Utilities.formatDate(start1, timeZone, "h:mm a");
所述Utilities.formatDate
函数需要,是一个有效IANA时区(如时区America/Los_Angeles
),而不是一个GMT的偏移等GMT+0700
。
我想提出的是,假设Session.getScriptTimeZone()
返回相应的区域。 如果没有,那么你可能需要硬编码特定的区域,或者使用不同的功能,以确定它。
此外, +"00"
在你有剧本假设所有时区使用整个小时的偏移量。 在现实中,有几个是有30分钟或45分钟的偏移。