夏令时问题



我是一个新手与别人的旧谷歌应用程序脚本,添加事件信息从谷歌表单收集到事件日历工作。一切都很好,只是时间差了一个小时。例子:

用户输入:
事件开始: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);
}
*/

事件处理涉及四个可能不同的时区。

  1. 输入日期字符串(如4/10/2023 7:30:00)的用户生活在时区中,但在任何地方都没有提到这一点,使得日期字符串不明确。
  2. 解析模棱两可的日期字符串,如
    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>

  1. 函数createEventDate对象作为起始和结束,没有歧义。当以iCal格式导出Google日历时,事件将显示在Google日历的时区中(参见" calendar settings "时间zone")。
  2. 如果用户在他们的Google calendar应用程序(或网页)中查看日历,他们会在"设置"中指定的时区中看到事件。General"。

在您的案例中检查从#2到#4的三个时区,以及它们是否与您在#1中假设的时区一致。如果这还不能解释你所观察到的,请编辑你的问题并命名这些时区。

(将DST_HOURS添加到Date对象不是一个干净的解决方案,特别是考虑到夏令时偏移量在一年的过程中变化。)

相关内容

  • 没有找到相关文章

最新更新