我一直在尝试编写一些函数来根据谷歌电子表格上多个单元格的信息创建谷歌日历和谷歌日历事件。
发布的第一期here日期部分已经得到解决。
现在我在时间部分遇到问题。
下面的代码:
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Passeios");
var timeStart = ss.getRange(6,4).getValue();
var timeEnd = ss.getRange(6,5).getValue();
var ssTZ = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
Logger.log("timeStart: " + timeStart );
Logger.log("timeEnd: " + timeEnd);
var dateStart = ss.getRange(6,8).getValue();
var dateStartObj = new Date(Utilities.formatDate(dateStart, 'ssTZ' , 'MMMM dd, yyyy HH:mm:ss Z'));
var timeStartObj= new Date(Utilities.formatDate(timeStart, 'ssTZ' , 'MMMM dd, yyyy HH:mm:ss Z'));
var justTimeStart = Utilities.formatDate(timeStart, ssTZ, 'HH:mm');
Logger.log(" Time Start Object: " + timeStartObj);
Logger.log("Time Start Object Hours: " + timeStartObj.getHours());
Logger.log("Time Start Object Minutes: " + timeStartObj.getMinutes());
Logger.log("Start Time HH:mm: " + justTimeStart)
var hourStart = Utilities.formatDate(timeStart, ssTZ, 'HH');
var minutesStart = Utilities.formatDate(timeStart, ssTZ, 'mm');
var hourEnd = Utilities.formatDate(timeEnd, ssTZ, 'HH');
var minutesEnd = Utilities.formatDate(timeEnd, ssTZ, 'mm');
Logger.log(" TimeZone :" + ssTZ);
Logger.log(hourStart);
Logger.log(minutesStart);
Logger.log(hourEnd);
Logger.log(minutesEnd);
产生以下日志
时间开始: 1899 年 12 月 30 日星期六 07:06:28 GMT-0300 (BRT)
时间结束: 1899 年 12 月 30 日星期六 07:36:28 GMT-0300 (BRT)
时间开始对象:1899 年 12 月 30 日星期六 07:06:28 GMT-0300 (BRT)
时间开始对象小时:7
开始对象时间分钟:6
开始时间 HH:mm: 07:00
时区 :America/Sao_Paulo
07
00
07
30
电子表格单元格的格式为 HH:mm,它显示
开始时间 07:00
07:30 结束时间
正如您所看到的,在记录单元格值或使用单元格值构造 Date() 对象时,我不确定存在大约 6 分 28 秒的偏移量。
将单元格格式设置为“小时”或“分钟”或“HH:mm”不会携带该偏移量。
EDIT.
我注意到 Date() 构造函数在单引号之间有 ssTZ 变量,因此它可能会被丢弃,因为它不应该被识别为有效的时区。
不确定它使用什么,但实际电子表格时区和错误引用的时区之间的差异似乎是 28 秒,我也不明白它们来自哪里。
6 分钟的偏移量仍然存在,您可以检查以下代码和日志打印。
var timeStart = ss.getRange(6,4).getValue();
var ssTZ = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var timeStartObj1= new Date(Utilities.formatDate(timeStart, 'ssTZ' , 'MMMM dd, yyyy HH:mm:ss Z'));
var timeStartObj2= new Date(Utilities.formatDate(timeStart, ssTZ , 'MMMM dd, yyyy HH:mm:ss Z'));
var justTimeStart = Utilities.formatDate(timeStart, ssTZ, 'HH:mm');
Logger.log("timeStart: " + timeStart );
Logger.log(" Time Start Object1: " + timeStartObj1);
Logger.log(" Time Start Object2: " + timeStartObj2);
Logger.log("justTimeStart: " + justTimeStart)
时间开始: 1899 年 12 月 30 日星期六 07:06:28 GMT-0300 (BRT)
时间开始对象 1:1899 年 12 月 30 日星期六 07:06:28 GMT-0300 (BRT)
时间开始对象2:1899 年 12 月 30 日星期六 07:06:00 GMT-0300 (BRT)
刚开始时间:07:00
EDIT 2
它与时区有关,并且可能由于日期被解释为 120 年前的 1899 年而进行了一些调整。
当使用以下构造函数时,在指定格式的字符串中不带 Z:
var timeStartObj3= new Date(Utilities.formatDate(timeStart, ssTZ , 'MMMM dd, yyyy HH:mm:ss'));
Logger.log(" Time Start Object3: " + timeStartObj3);
日志结果为:
时间开始对象3:1899 年 12 月 30 日星期六 07:00:00 GMT-0300 (BRT)
EDIT 3.
越来越奇怪了……
如果我在 Logger.log 调用上使用文本串联,我会得到一个不同的字符串,如果我仅使用 var 名称调用日志:
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Passeios");
var timeStart = ss.getRange(6,4).getValue();
Logger.log("timeStart: " + timeStart);
Logger.log(timeStart);
时间开始: 1899 年 12 月 30 日星期六 07:06:28 GMT-0300 (BRT)
1899 年 12 月 30 日星期六 07:00:00 GMT-03:06
我确实明白,实际上相同的时间以不同的方式表示(我假设即使没有显示,28 秒也存在)。
我的猜测是,无论是否使用连接,文本解析方法都有不同的行为(这至少令人困惑)。
我仍然不知道那些 06 分钟和 28 秒来自哪里,也不知道在使用来自单元格值的时间和日期(仅包含日期或仅时间)并且必须将它们混合时如何确保一致性。
这实在是令人困惑……