如何使用正确的TimeZone获取日期()

问题描述 投票:0回答:1

“欧洲/伦敦”(UTC + 0)时区的某个人创建了一个电子表格。他们将日期“2019年3月22日”输入其中一个字段。这代表日期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_()这样的函数时,将“2019年3月22日”作为日期,将早上6点作为时间,这是有问题的。这导致它产生日期“March 21 2019 6:00 UTC-7”而不是“March 22 2019 6:00 UTC-7”。

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

datetime google-apps-script google-sheets timezone
1个回答
0
投票

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

看来这就是发生的事情:

  1. 该值被硬编码为“March 22”(文本)。
  2. 当用户打开工作表时,无论他们处于什么时区,它都会假设它代表工作表时区中的3月22日。 3/22/2019 0:00 UTC+0
  3. 一旦你将值读入JavaScript Date,所有日期函数都假定你需要它在你当前的(也就是脚本的)时区。 3/21/2019 17:00 UTC-7

Solution A: Just add the hours

忘记时区吧。而不是在Date中硬编码小时,只需将日期偏移您想要的小时数。

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

Solution B: Do some math

我很快就会更新,但最终你可能想要一个可以像这样使用的函数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;
}
© www.soinside.com 2019 - 2024. All rights reserved.