【发布时间】:2019-07-31 17:56:39
【问题描述】:
我一直在尝试编写一些函数来根据谷歌电子表格上多个单元格的信息创建谷歌日历和谷歌日历事件。
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
时区:美国/圣保罗
07
00
07
30
电子表格单元格的格式为 HH:mm 并显示 07:00 开始时间 07:30 结束时间
正如您所见,在记录单元格值或使用单元格值构造 Date() 对象时,我不确定从哪里来的 6 分 28 秒的偏移量。
将单元格格式化为仅小时或分钟或 HH:mm 不会带有该偏移量。
编辑。
我注意到 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)
justTimeStart: 07:00
编辑 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)
编辑 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)
12 月 30 日星期六 07:00:00 GMT-03:06 1899
我确实理解实际上相同的时间以不同的方式表示(我假设即使未显示 28 秒也是如此)。
我的猜测是,无论是否使用连接,文本解析方法的行为都会有所不同(这至少令人困惑)。
我仍然不知道那些 06 分和 28 秒来自哪里,或者在使用来自单元格值的时间和日期时如何确保一致性,而时间和日期来自只有日期或只有时间的单元格值,并且必须混合它们。
这真是令人困惑......
【问题讨论】:
-
为了确认
where those 06 minutes and 28 seconds come from,你能提供一个样本电子表格来复制你的情况吗?在您的问题中,timeStart和timeEnd是getValue()检索到的值。所以首先,我想确认单元格的值。
标签: datetime google-apps-script google-sheets timezone timezone-offset