0

我的一位同事编写了一个 Google Apps 脚本来自动化工作流程(批准酒店的房间补偿请求)。总的来说,该脚本似乎按预期运行。脚本中有一个按自动计划运行的函数(基于时间,而不是事件驱动)。有好几次入住日期错了一个,导致预订错误。不幸的是,并非所有请求都发生这种情况。提出请求的所有相关用户都在同一时区 (EST)。

例如,我见过这样的事件,其中提交的请求的签入日期为 10 月 22 日,签出日期为 10 月 23 日,但是当脚本运行并且提交者收到批准签入通知时日期移至 10/21,退房时间移至 10/22。

HTML 电子邮件的相关部分只是从电子表格行中提取值:+ "

" + "预计入住日期:" + Utilities.formatDate(row.arrivalDate, "EST", "MM-dd-yyyy") + "

" + "预计退房日期:" + Utilities.formatDate(row.departureDate, "EST", "MM-dd-yyyy")

什么可能导致这种行为?这可能是因为执行代码的给定 Google 服务器上的时间吗?

4

3 回答 3

3

请确保电子表格的时区(位于File > Spreadsheet settings和脚本项目的时区(位于File > Project properties)都设置正确。电子表格的时区控制如何从单元格中读取日期/时间值, 而脚本的时区控制新 Date 对象、触发器等的默认值。

于 2012-05-29T19:22:17.773 回答
2

根据我的经验,这可能是 EST 和 EDT 混淆的结果,尤其是在转换期间提交的数据。让我举个例子:假设我们在冬季时间(EDT),并且提交了一个请求以 EST 为日期:如果您的脚本强制日期为 EST,则 EDT 日期将被误解。根据您设置时间的方式,可能会导致白班。我所做的从根本上解决了这个问题是在使用 Utilities.formatDate() 时考虑当前的夏季/冬季时间。这是我使用的代码片段,也许您可​​以尝试一下:(我在欧洲,所以值不同但原理相同)

  var FUS1=new Date().toString().substr(25,8);// FUS1 gets the GMT+0200 or GMT+0100 string
// Fri Sep 24 2010 10:00:00 GMT+0200 (CEST) for example
  if (FUS1!="GMT+0200"){FUS1="GMT+0100"};// and takes care of summer time !
  var today=Utilities.formatDate(new Date(),FUS1,"dd-MM-yyyy")+" à "+Utilities.formatDate(new Date(),FUS1,"HH:mm")

有关完整描述,您可以查看我很久以前提出的这个问题,这不是一个真正的问题;-)

于 2012-05-25T16:08:31.567 回答
1

我遇到了类似的问题,但我的问题是在格式为 MM/dd/yyy 的表格中输入日期。从电子表格中获取日期以发布到电子邮件时,总是少一天。

我在东部时间 (GMT-5:00)。我在我的项目属性和电子表格设置中验证了它是正确的。深入挖掘后,我意识到虽然在表格中输入并显示在电子表格中的日期是 7/27/2012,但电子表格中的实际日期是:

2012 年 7 月 26 日星期四 21:00:00 PDT

这具有“某种”意义,因为 2012 年 7 月 27 日 00:00:00 东部时间 (GMT-5:00) 将比 PDT 的前一天早三个小时。我只是格式化了格林威治标准时间的日期。我本可以将它格式化为 EDT,它应该一直可以工作,但是如果代码需要随着季节的变化而改变,那么对它进行硬编码 GMT 或多或少地让其他人阅读代码时产生了猜测。我只需要日期。

我确实复制并粘贴了这篇文章中的 FUS1 示例(现在作为评论)作为处理问题的一种更“雄辩”的方式。谢谢!

于 2012-07-21T21:10:42.377 回答