脚本输出中日期更改的奇怪问题

时间:2012-05-25 14:38:17

标签: google-apps-script

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

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

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

”+“Est Check In Date:”+ Utilities.formatDate(row.arrivalDate,“EST”,“MM-dd-yyyy”)       +“

”+“Est退房日期:”+ Utilities.formatDate(row.departureDate,“EST”,“MM-dd-yyyy”)

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

3 个答案:

答案 0 :(得分:2)

请确保电子表格的时区(位于文件>电子表格设置中以及脚本项目的时区(位于文件>项目属性)中)两者都设置正确。电子表格的时区控制如何从单元格读取日期/时间值,而脚本的时区控制新Date对象,触发器等的默认值。

答案 1 :(得分:1)

根据我的经验,这可能是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")

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

答案 2 :(得分:1)

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

我在东部时间(格林威治标准时间-5:00)。我在项目属性和电子表格设置中验证了它是正确的。在深入挖掘之后,我意识到尽管在表单中输入并在电子表格中显示的日期是2012年7月27日,但电子表格中的实际日期是:

Thu Jul 26 21:00:00 PDT 2012

这使得“有些”感觉,正如7/27/2012 00:00:00美国东部时间(格林威治标准时间-5:00)将是PDT前一天的三小时。我简单地格式化了GMT日期。我本来可以把它格式化为EDT,并且应该一直有效,但是如果代码需要随着季节的变化而改变,那么GMT或多或少的硬编码会把猜测从其他人那里读出来。我只需要约会。

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