【问题标题】:How to getValue() on a date with the correct TimeZone?如何在具有正确时区的日期获取值()?
【发布时间】:2019-03-14 18:03:41
【问题描述】:

“欧洲/伦敦”(UTC +0) 时区的某个人创建了一个电子表格。他们在其中一个字段中输入日期“2019 年 3 月 22 日”。这代表日期3/22/2019 0:00 UTC+O

我在“美国/洛杉矶”(UTC -7) 时区。当我运行 Google Apps 脚本并尝试获取该值时,它被评估为:

Thu Mar 21 17:00:00 GMT-07:00 2019

这是准确的,因为3/22/2019 0:00 UTC+O == 3/21/2019 17:00 UTC-7

问题是当我尝试以编程方式获取日期时,我会得到 21 而不是 22。

例如,如果我尝试运行:

cellRange.getValue().getDate() // returns 21 even though the sheet shows the date as 22

这是因为getDate() 返回值“根据当地时间”。本地脚本时间是 UTC-7,因此它返回 21。

但是,这会导致不和谐:

  • 电子表格日期:22(即我在表格中看到的值)
  • 程序化日期:21(即上面getDate()返回的那个)

例如,当我尝试使用诸如 joinDateAndTime_() 之类的函数时,将“2019 年 3 月 22 日”作为日期,将上午 6 点作为时间,这是有问题的。这会导致它生成日期“2019 年 3 月 21 日 6:00 UTC-7”而不是“2019 年 3 月 22 日 6:00 UTC-7”。

这里最好的解决方案是什么?

【问题讨论】:

  • 使用 UTC?不允许在日期表示中出现歧义?

标签: datetime google-apps-script google-sheets timezone


【解决方案1】:

不是一个完整的解决方案(我会尽快更新)

好像是这样的:

  1. 该值被硬编码为“March 22”(文本)。
  2. 当用户打开工作表时,无论他们在哪个时区,它都会假定它代表工作表所在时区的 3 月 22 日。 3/22/2019 0:00 UTC+0
  3. 将值读入 JavaScript Date 后,所有日期函数都假定您希望它位于当前(也称为脚本的)时区。 3/21/2019 17:00 UTC-7

解决方案 A:只需添加小时数

忘记时区。无需在 Date 中硬编码小时数,只需将日期偏移您想要的小时数即可。

唯一的缺点是您需要根据它所在的时区确定日期从0:00 开始。(例如,如果他们决定写“2019 年 3 月 22 日 5:00”,那么您将抵消时间不正确。)

解决方案 B:做一些数学运算

我很快就会更新这个,但最终你可能想要一个函数 sheetTimezoneOffset() 可以像这样使用:

function getDate(cellRange) {
    var date = cellRange.getValue().getDate();
    var extraneousHours = formatDate(date, "h", sheetTimezoneOffset());
    date = date.addHours(-extraneousHours);
    var offsetHours = 6; // e.g. for 6am
    date.addHours(offsetHours);
    return date;
}

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多