首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与正确的getValue()约会时使用正确的TimeZone?

如何与正确的getValue()约会时使用正确的TimeZone?
EN

Stack Overflow用户
提问于 2019-03-14 18:03:41
回答 1查看 188关注 0票数 0

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

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

代码语言:javascript
复制
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。

例如,如果我试图运行:

代码语言:javascript
复制
cellRange.getValue().getDate() // returns 21 even though the sheet shows the date as 22

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

然而,这造成了不和谐:

  • 电子表格日期: 22 (即我在表格中看到的值)
  • 编程式日期: 21 (即上文getDate()返回的日期)

例如,当我试图使用“2019年3月22日”作为日期,以早上6点为时间的joinDateAndTime_()这样的函数时,这是有问题的。这导致它产生一个日期为“2019年3月21日6:00世界协调时-7”,而不是“2019年3月22日6:00世界协调时-7”。

这里最好的解决办法是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-03-14 18:06:19

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

似乎这就是正在发生的事情:

  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开始的,无论它在哪个时区。(例如,如果他们决定写“2019年3月22日5:00",那你就错了。)

解决方案B:做一些数学

我很快就会更新它,但最终您可能需要一个可以像这样使用的函数sheetTimezoneOffset()

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55169261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档