夏令时问题

问题描述 投票:0回答:1

我是一个新手,正在使用别人的旧 Google 应用程序脚本,该脚本将从 Google 表单收集的事件信息添加到事件日历中。 一切都很好,只是时间缩短了一个小时。例子:

用户输入:
活动开始: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]] + '\n\n';
  }
  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);
}

*/
forms google-apps-script calendar timezone dst
1个回答
0
投票

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

  1. 输入像
    4/10/2023 7:30:00
    这样的日期字符串的用户生活在一个时区,但是在任何地方都没有提到这一点,使日期字符串变得模棱两可。
  2. 解析一个不明确的日期字符串
    new Date("4/10/2023 7:30:00")
    
    在 Google Apps
    script
    的时区创建一个 Date 对象(参见“项目设置 > 常规设置 > 时区”)。如果这与#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. 函数
    createEvent
    Date
    对象作为开始和结束,没有歧义。当以 iCal 格式导出 Google 日历时,事件显示在 Google calendar 的时区中(请参阅“日历设置 > 时区”)。
  2. 如果用户在他们的谷歌日历app(或网页)中查看日历,他们会在“设置>常规”中指定的时区看到事件。

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

(将

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

© www.soinside.com 2019 - 2024. All rights reserved.