如何在具有正确的时区的日期上获取Value()?

时间:2019-03-14 18:03:42

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

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

我在“ America / Los_Angeles”(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_()之类的函数时,例如以“ March 22 2019”作为日期,而将6am作为时间,则是有问题的。这会导致它产生一个日期“ 2019年3月21日6:00 UTC-7”,而不是“日期2019年3月22日6:00 UTC-7”。

什么是最好的解决方案?

1 个答案:

答案 0 :(得分:0)

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

似乎正在发生这种情况:

  1. 该值被硬编码为“ 3月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开始。(例如,如果他们决定写“ March 22 2019 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;
}