【问题标题】:Google Apps Script showing previous day显示前一天的 Google Apps 脚本
【发布时间】:2021-10-02 00:03:28
【问题描述】:

当我查看电子表格上的日期时,我看到的是 2005 年 11 月 1 日。 当我将它读入谷歌脚本时,它变为 2005 年 10 月 31 日。
我在 PDT,我的电子表格在 PDT,(UTC-8)。

是否有一种简单的方法可以从电子表格中读取日期,使其显示的日期与电子表格上的日期相同?

可能与QuestionQuestion有关

这不起作用:

let date2 = Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd");

这是一个我能想到的最简单的例子:

function myFunction() {
  let data = SpreadsheetApp.getActive()
              .getSheetByName("Sheet1")
              .getDataRange()
              .getValues();
  let header = data[0]
  data.splice(0,1) // remove header
  data.forEach(row => {
    let date = row[0]
    let month = date.getMonth() + 1 // zero based month
    let day = date.getDate()
    let year = date.getFullYear()
    row[1] = month;
    row[2] = day;
    row[3] = year;
  })
  data.splice(0,0,header) // put header back
  SpreadsheetApp.getActive()
              .getSheetByName("Sheet1")
              .getDataRange()
              .setValues(data);  
}

Date                MM  DD  YYYY
11/1/2005 0:00:00   10  31  2005  <--  1 day behind
11/1/2007 0:00:00   10  31  2007
11/1/2009 0:00:00   10  31  2009
11/1/2011 0:00:00   10  31  2011
11/1/2015 0:00:00   10  31  2015
11/1/2017 0:00:00   10  31  2017
11/1/2019 0:00:00   10  31  2019
11/1/2021 0:00:00   10  31  2021

【问题讨论】:

  • 我认为 GMT-7 是山区时间 PDT 是 GMT-8 检查here
  • 知道了,修复了...

标签: javascript google-apps-script google-sheets


【解决方案1】:

我认为发生的事情是电子表格上的日期没有时间,当您将其读入 GAS 时,GAS 会假设电子表格上的原始时间是 UTC,所以当您阅读它时,它会转换为 PDT,减去 8 小时。 所以你看到的是(日期 - 8 小时)PDT。例如从 2005 年 11 月 1 日开始,您会看到:

2005 年 10 月 31 日星期五 16:00:00 GMT-0800(太平洋标准时间)

要修复,您只需要向后添加 8 小时:

let date = row[0]
let date1 = new Date(date)
date1 = new Date(date1.setHours( date1.getHours() + 8 )) // timezone adjustment

或者,一个更好的主意可能是先从日期中提取日期偏移量,然后将其用于调整。如果您不在 PDT 之外,这可能会起作用。

let date = row[0]
let offset = date.getTimezoneOffset() // offset in minutes
let date2 = new Date(date)
date2 = new Date(date2.setMinutes(date2.getMinutes() + offset))

作为 1 行修复:

date = new Date(date.setMinutes(date.getMinutes() + date.getTimezoneOffset()))

【讨论】:

    【解决方案2】:

    这样的问题通常是因为 脚本项目电子表格 位于不同的时区。许多脚本项目使用 GMT,而电子表格使用用户的默认时区。

    时区差异不一定会导致问题,因为Date 对象仍然代表与电子表格日期相同的时间点,即使它们位于不同的时区。

    要处理创建用户可读的日期时间文本字符串时的问题,请使用Utilities.formatDate() 获取电子表格时区中的日期,如下所示:

    const formattedDate = Utilities.formatDate(date, SpreadsheetApp.getSpreadsheetTimeZone(), 'yyyy-MM-dd HH:mm');

    使用文件>电子表格设置来设置电子表格的时区。它不依赖于系统,但可以在每个电子表格上单独设置。在新电子表格中,默认值来自创建电子表格的用户的帐户设置。

    【讨论】:

    • SpreadsheetApp.getActive().getSpreadsheetTimeZone() 在我的系统上返回“”。
    • 可能是真的,但不是很有帮助,因为电子表格和我所在的时区是相同的。
    • 编辑了关于 script projectspreadsheet 的时区之间差异的答案。创建电子表格后,用户在键盘上的时区不会产生影响。
    • 知道了,我的应用时区在清单上是 PDT:“timeZone”:“America/Los_Angeles”,在电子表格上也是如此。 GMT-8 太平洋时间
    • @KarlS 你试过Utilities.formatDate()getSpreadsheetTimeZone() 吗?结果和你想看到的不一样吗?
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多