google-apps-script - 如何使用日历的时区设置日期对象的时区

标签 google-apps-script

我想使用日历时区来设置日期对象的时区。我正在寻找合适的技术。我们在全国有几个基地,每个基地都有自己的日记和日常事件日历。我们有多个发布到日历的脚本。我想使用日历的时区来设置日期对象时区,因为用户前往不同的基地,他们的计算机可能未设置为正确的时区。我们希望避免错误的时间设置。

  1. 脚本的时区是否应该设置为 UTC?

  2. 这是我目前所在的位置:

    function submitUiTest(e) {
      var app = UiApp.getActiveApplication();
      var cal = CalendarApp.getCalendarById('calendarId');
      var timeZone = cal.getTimeZone();
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Sheet1');
    
      var startTime = e.parameter.startDate
      startTime.setHours(e.parameter.startHour, e.parameter.startMin, 0)
      startTime = formatTime(startTime, timeZone);
      Logger.log(startTime)
    
      var endTime = e.parameter.endDate
      endTime.setHours(e.parameter.endHour, e.parameter.endMin, 0);
      endTime = formatTime(endTime, timeZone);
      Logger.log(endTime)
    
      cal.createEvent('TimeZone Test', new Date(startTime), new Date(endTime));
    
      ss.appendRow([startTime, endTime]);
    
      return app;
    }
    
    function formatTime(time, timeZone){
      return Utilities.formatDate(time, (timeZone-time.getTimezoneOffset()), 'M/d/yyyy HH:mm');
    }
    

编辑: 目前有 3 个日历,它们不是用户日历,只是为各个航空站创建的单独日历。每个航空站都位于不同的时区。当工作人员在这些站点工作时,他们会将日常事件发布到日历中,并且还有几个 Ui 脚本我们将其发布到相同的日历中。飞行日志。当日历条目发布到任何日历时,时间仅与脚本上设置的时区相关,与日历上的时区无关。创建日期或时间戳对象时,如何使用日历本身设置的时区。

记录不同时区日期的脚本的最佳做法是什么? 将脚本时区设置为 UTC 并进行转换? 你用什么来获取用户的时区,或者在这种情况下,我也不关心用户的时区设置了什么,我需要使用日历的时区。

最佳答案

这是答案的修改版本,没有 UI 内容:

function gasTimezoneOffset(date, hour){
  var cal,calTimeZone,calTz,date,dateString,scriptTimeZone,sessionTz;

  var testMonth = "March",
      testDayOfMnth = "26",
      testYr = "2016",
      hour = "10:00",
      timeZoneDiff = 0;

  Logger.log("Script Time Zone: " + Session.getScriptTimeZone());

  dateString = testMonth + " " + testDayOfMnth + ", " + testYr;
  Logger.log("dateString: " + dateString);

  date = new Date(dateString);

  cal = CalendarApp.getDefaultCalendar();
  calTimeZone = cal.getTimeZone();

  calTimeZone = Utilities.formatDate(date, calTimeZone, 'Z');
  scriptTimeZone = Utilities.formatDate(date, Session.getTimeZone(), 'Z');

  calTz = Number(calTimeZone.slice(0,3));
  sessionTz = Number(scriptTimeZone.slice(0,3));

  //If both time zones are the same sign, get the difference between the
  //two.  E.g. -4 and -2.  Difference is 2
  //if each time zone is a different sign, add the absolute values together.
  //-4 and +1 should be 5
  if (calTz < 0 && sessionTz > 0 || calTz > 0 && sessionTz < 0){
    timeZoneDiff = Math.abs(Math.abs(calTz) + Math.abs(sessionTz));
  } else {
    timeZoneDiff = Math.abs(Math.abs(calTz) - Math.abs(sessionTz));
  };

  hour = Number(hour.slice(0,2));    
  return hour + timeZoneDiff;
};

关于google-apps-script - 如何使用日历的时区设置日期对象的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645343/

相关文章:

google-apps-script - 将事件从一个 Google 日历复制到另一个 Google 日历,无需重复

google-apps-script - 将 Google Apps 脚本 URL 正确嵌入到 Google 网站中

spreadsheet - 将电子表格连接到 Web 数据库的最佳方法

google-apps-script - 如何检查当前提交是编辑回复还是新回复

forms - 检索 Google 表单回复者的电子邮件地址,而无需在表单中询问他们的电子邮件地址

javascript - getDisplayValues() 不写为字符串

google-apps-script - 用于获取用户签名的 Apps 脚本

javascript - Google 脚本运行时优化

google-apps-script - "The starting column of the range is too small"错误

javascript - 如何从数组中提取特定值?