google-apps-script - Google Apps 脚本中的时区

标签 google-apps-script

我想将日期对象转换为与 Google 电子表格中使用的日期的基本值一致的“序列号”。我的理解是,在 Javascript 中,日期对象的原始值是 1970 年 1 月 1 日午夜之后(或之前)的毫秒数;在 Google 电子表格中,日期的原始值为 0(零),即 1899 年 12 月 30 日午夜,此后的每一天都等于 1(例如,7 小时等于 7 除以 24)。

我尝试过这个功能:

function date2Serial(date) {
  return (date.getTime() + 2209161600000) / 86400000;
  // 2209161600000 = milliseconds between 1899-12-30 and 1970-01-01
  // 86400000 = milliseconds in a day
  // question "on the side" - is there any essential difference between
  //  .getTime() and .valueOf()?
}

这会返回一个有点偏离的值 - 我认为“off”对应于我与 GMT 的时区差异。因此,即使在我的情况下,电子表格设置和项目属性都设置为 GMT+10,但 getTime() 似乎在 GMT 上运行。

例如:

A1: 16/09/2012 06:00:00
A2: =date2serial(A1)
A3: =VALUE(A1)

A2 返回 41167.8333,其中 A3 返回 41168.25。

现在我尝试使用 getTimezoneOffset()方法,似乎可以纠正该问题:

function date2Serial(date) {
  return (date.getTime() + 2209161600000 - (date.getTimezoneOffset() * 60000)) / 86400000;
}

但是,这依赖于项目属性时区是否正确,而不是电子表格设置时区(实际上可以对每个时区进行不同的设置)。

我的问题:

这种行为是预期的吗?时区是否有必要“调整”?或者 getTime()(以及所有其他方法,如 getHours()、getMinutes() 等)是否应该在用户设置的时区而不是 GMT/UTC 上运行,并且“调整”实际上是错误的解决方法?

最佳答案

getTime() 返回一个持续时间,而不是某个时刻,因此没有时区。减去的引用时刻是 1970 年 1 月 1 日午夜(UTC)。

诸如 getHours()、getMinutes() 等方法给出了时间的一部分。结果取决于所使用的日期对象的时区。如果您想独立于日期对象的时区,您应该使用 getUTCHours()、getUTCMinutes() 等。

关于google-apps-script - Google Apps 脚本中的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451292/

相关文章:

javascript - 如何修复工作表之间自动传输行的错误集成?

google-apps-script - 使用 Google Apps 脚本删除 Google 文档中的表格行

javascript - 无法聚焦 onOpen 触发器中的单元格

google-apps-script - 谷歌脚本 : cannot convert range to (class) error

google-apps-script - 您如何使用 Google Apps 脚本以编程方式更新电子邮件休假回复?

javascript - indexOf 无法在 Google Apps 脚本中工作

javascript - 通过更新谷歌表格中的行在谷歌驱动器中创建文件夹

google-apps-script - 根据一列删除重复项并在 Google 表格中保留最新条目

google-apps-script - 如何在谷歌表格中创建函数 sleep(毫秒) 以延迟或暂停一定范围内的公式

javascript - 如何在谷歌表单中仅邮寄填充值而不邮寄空白值?