我正在以编程方式从Google表格中的数据行生成新的表单响应(一个审批工作流系统在第二个审批工作流系统中生成新的审批请求)。数据包括日期。我的脚本从单元格中获取日期值作为字符串,将其转换为本地JavaScript日期对象,然后使用createResponse()将其提交到新的表单响应中。以下是相关代码:
var startDate = googleFormsDateStringToDate(eventDetails['Event Start Date']);
var r = item.createResponse(startDate);
在大多数情况下,该系统运行稳定。除了一个有趣的问题-在 2020年4月29日之后的任何日期,响应中存储的日期都会减少1天。该日期或此日期之前的任何日期都可以正常工作,之后的任何日期都减少一天。
我尝试了一些事情。
日期对应于事件的开始日期和结束日期。如果开始日期在此日期之前,而结束日期在此日期之后,则结束日期将递减,同时准确记录开始日期。因此,我可以确定问题直接与我提交的日期是否早于该日期有关。
我已经进行了广泛的测试,并且绝对可以确定字符串日期转换是否有效。如果在创建响应后立即立即检索了值(甚至在提交表单响应之前),我发现它已减小:
var startDate = dateStringToDate(eventDetails['Event Start Date']);
Logger.log(startDate.toString()); // startDate is always accurate
var r = item.createResponse(startDate);
Logger.log(r.getResponse()); // if after 29/04/2020, will be decremented by 1 day
这告诉我问题恰好在我创建响应时发生,并且正在“在Google端”发生。
我的怀疑之一可能是时区问题,但这不能解释为什么该问题直接与此特定日期相关。我的另一个怀疑是2020年是a年,所以我们得到了29/02/2020,而发生错误的日期是29/03/2020。也许在Google实施createResponse之后的某个地方,它无法说明account年吗?
在我可以确定错误之前,我计划实施一个变通办法,在该办法中,我将使用getResponse()检查响应日期是否与预期日期匹配并进行相应的更正。但是我更愿意了解导致错误的原因(因此我知道这是一个需要报告的错误,还是我缺乏理解),并在可能的情况下找到解决方案。
那么,具体问题是:错误的根源是什么?有解决方案(而不是解决方法)吗?
编辑 在找出解决方法的同时,我已经回答了我的第一个问题。在英国,夏令时开始于2020年4月29日。由于通过Google表单输入的日期没有与之关联的时间,因此该时间似乎存储为00:00:00或午夜。我假设正在发生的事情是夏时制(1小时)的调整从该时间中减去一个小时,从而将其回滚到前一天。
我的最后一个问题是:是否有办法可靠地防止发生此错误,而不是手动检查不正确的日期(或以夏时制日期进行编程)?