我是一个新手与别人的旧谷歌应用程序脚本,添加事件信息从谷歌表单收集到事件日历工作。一切都很好,只是时间差了一个小时。例子:
用户输入:
事件开始:4/10/2023 7:30:00
事件结束:4/10/2023 9:15:00
日历显示:
4月10日星期一⋅8:30 - 10:15am
这是脚本。
一开始就有DST偏移。
底部有一个获取时区偏移量的函数。(但它似乎被注释掉了)
我的用户知道他们的活动将在什么时间举行。我们不需要任何补偿。表单响应中出现的内容应该出现在日历中。
请告诉我我需要做什么来解决这个问题。
const DST_HOURS = -0;
function onFormSubmit(e) {
const TARGET_CAL_ID = 'kinnschools.org_bunn4o6u6do0uvgmfiqo3ifp2o@group.calendar.google.com';
// Fields: 0 = Timestamp, 1 = Email Address, 2 = Event Title:, 3 = Event Start:, 4 = Event End:,
// 5 = Building:, 6 = Room:, 7 = Presenter Contact Info :, 8 = Computer Services:,
// 9 = Custodial Services:, 10 = Food Services:, 11 = Additional Info:
var title = e.values[5] + '-' + e.values[6] + ' ' + e.values[2] + ' (evnt1)';
var description = '';
var descObj = {
'Event Submitted by': 1,
'Presenter Contact Info': 7,
'Computer Services': 8,
'Custodial Services': 9,
'Food Services': 10,
'Additional Info': 11
};
for (var f in descObj) {
description += f + ':n' + e.values[descObj[f]] + 'nn';
}
var startTime = new Date(e.values[3]).addHours(),
endTime = new Date(e.values[4]).addHours();
var event = CalendarApp.getCalendarById(TARGET_CAL_ID).createEvent(title, startTime, endTime, {
description: description
});
}
function testFormInput(e) {
var sheet = SpreadsheetApp.getActive().getSheets()[0];
var d = sheet.getRange(sheet.getLastRow(), 4).getValue();
var values = ['_' + e.values[3], e.values[3], new Date(e.values[3]), d];
sheet = SpreadsheetApp.getActive().getSheets()[1];
sheet.appendRow(values);
}
Date.prototype.addHours = function() {
this.setHours(this.getHours() + DST_HOURS);
return this;
}
/*
function getTimeZoneOffsets() {
var d = new Date();
var n = d.getTimezoneOffset();
var sheet = SpreadsheetApp.getActive().getSheets()[1];
//var s = '10/7/2019 12:50:00 -0500';
var zones = sheet.getRange('B2:E2').getValues()[0].map(function(d) {
return d.getTimezoneOffset();
});
Logger.log(zones);
}
*/
事件处理涉及四个可能不同的时区。
- 输入日期字符串(如
4/10/2023 7:30:00
)的用户生活在时区中,但在任何地方都没有提到这一点,使得日期字符串不明确。 解析模棱两可的日期字符串,如
new Date("4/10/2023 7:30:00")
在Google Apps脚本的时区创建一个Date
对象(参见"Project Settings "一般设置>时间zone")。如果这与#1的时区不同,那么结果只能是错误的。下面的代码片段展示了如何通过在浏览器中使用#1时区解析日期来明确日期字符串。Ambiguous date string:
<input name="datetime" type="datetime-local"
onchange="this.nextElementSibling.textContent=new Date(this.value).toISOString()"/>
Unambiguous date string:
<div></div>
- 函数
createEvent
取Date
对象作为起始和结束,没有歧义。当以iCal格式导出Google日历时,事件将显示在Google日历的时区中(参见" calendar settings "时间zone")。 - 如果用户在他们的Google calendar应用程序(或网页)中查看日历,他们会在"设置"中指定的时区中看到事件。General"。
在您的案例中检查从#2到#4的三个时区,以及它们是否与您在#1中假设的时区一致。如果这还不能解释你所观察到的,请编辑你的问题并命名这些时区。
(将DST_HOURS
添加到Date
对象不是一个干净的解决方案,特别是考虑到夏令时偏移量在一年的过程中变化。)