【问题标题】:Google Form on Submit get values and format the timeGoogle Form on Submit 获取值并格式化时间
【发布时间】:2021-01-29 05:36:23
【问题描述】:

我正在使用带有 Google 表单的 Google Apps 脚本。当用户提交 Google 表单时,我会从问题中得到一个值。然后我取该值并将其设为日期对象,根据我在post about daylight savings 上看到的内容,我使用它来确定时区。我通过 Utilities.formatDate 运行日期对象,并希望获得格式正确的日期。

示例:上午 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);
  }
}

【问题讨论】:

    标签: javascript google-apps-script timezone google-forms


    【解决方案1】:

    Utilities formatDate 不支持 GMT... 参数的假设不成立。

    您在参考中提到的帖子用于获取日历事件,当您从另一个夏令时获取事件(从日历事件本身获取 TZ 信息)时,它是一种获得正确值的有用方法,例如事件下个月将是“夏令时”,而我们仍处于“冬令时”......

    您的问题可能来自不同的来源,具体取决于脚本的时区设置与来源的时区。你能描述一下你使用这个脚本的确切配置吗?

    同时,这里有一个小代码演示了代码是如何工作的 + 记录器结果:

    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 方法 (issue 2204),但这已得到修复。

    EDIT 2 : 在同一主题上,两种方法实际上返回相同的结果,GMT 字符串的唯一优点是您不必知道确切的时区名称...还有Session.getScriptTimeZone() 方法。下面是一个演示脚本,显示了 1 月和 7 月 2 个日期的结果以及日志结果:

    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');
    }
    

    还要注意,Logger 有自己的方式来显示日期对象的值!它使用 ISO 8601 时间格式,即 UTC 值。

    【讨论】:

      【解决方案2】:

      试试这个:

      var timeZone = Session.getScriptTimeZone();
      var startT = Utilities.formatDate(start1, timeZone, "h:mm a");
      

      Utilities.formatDate 函数需要一个有效的 IANA 时区(例如 America/Los_Angeles),而不是像 GMT+0700 这样的 GMT 偏移量。

      我假设Session.getScriptTimeZone() 返回适当的区域。如果不是,那么您可能需要对特定区域进行硬编码,或者使用不同的函数来确定它。

      此外,您所拥有的脚本中的 +"00" 假设所有时区都使用整小时偏移量。实际上,有几个有 30 分钟或 45 分钟的偏移量。

      【讨论】:

      • 并为我之前的回答道歉。我并没有居高临下的意思。我只是错过了这段代码在 Google Apps 脚本的上下文中运行,而不是在网络浏览器中。我删除了那个答案。我希望这更有帮助。
      • 谢谢@Matt Johnson,它更有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多