gpt4 book ai didi

datetime - 处理日期/时间和时区的奇怪时间偏移

转载 作者:行者123 更新时间:2023-12-05 02:11:36 25 4
gpt4 key购买 nike

我一直在尝试编写一些函数,以根据来自 google 电子表格中多个单元格的信息创建 google 日历和 google 日历事件。

第一期发布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);

产生如下日志

timeStart: Sat Dec 30 1899 07:06:28 GMT-0300 (BRT)

timeEnd: Sat Dec 30 1899 07:36:28 GMT-0300 (BRT)

Time Start Object: Sat Dec 30 1899 07:06:28 GMT-0300 (BRT)

Time Start Object Hours: 7

Time Start Object Minutes: 6

Start Time HH:mm: 07:00

TimeZone :America/Sao_Paulo

07

00

07

30

电子表格单元格的格式为 HH:mm 并显示07:00 开始时间07:30 为结束时间

如您所见,在记录单元格值或使用单元格值构造 Date() 对象时,我不确定偏移量来自何处。

将单元格格式化为仅小时或仅分钟或 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)

timeStart: Sat Dec 30 1899 07:06:28 GMT-0300 (BRT)

Time Start Object1: Sat Dec 30 1899 07:06:28 GMT-0300 (BRT)

Time Start Object2: Sat Dec 30 1899 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);

日志结果为:

Time Start Object3: Sat Dec 30 1899 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);

timeStart: Sat Dec 30 1899 07:06:28 GMT-0300 (BRT)

Sat Dec 30 07:00:00 GMT-03:06 1899

我确实理解它实际上是相同的时间以不同的方式表示(我认为即使没有显示也有 28 秒)。

我的猜测是,无论是否使用串联,文本解析方法都会有不同的行为(这至少令人困惑)。

我仍然不知道那些 06 分 28 秒从何而来,也不知道在使用来自只有日期或只有时间的单元格值的时间和日期并且不得不混合使用它们时如何确保一致性。

这真是令人困惑...

最佳答案

6分28秒来自Local Mean Time (LMT) 圣保罗和 GMT 之间的偏移量。 You can see it in the TZDB sources :

# Zone  NAME               STDOFF    RULES   FORMAT   [UNTIL]
Zone America/Sao_Paulo -3:06:28 - LMT 1914
-3:00 Brazil -03/-02 1963 Oct 23 0:00
-3:00 1:00 -02 1964
-3:00 Brazil -03/-02

LMT 条目在第一行。最后一列 (1914) 是“直到”日期 - 这意味着在 TZDB 中,LMT 一直使用到 1914 年。之后,区域条目中的下一个规则适用 (-3:00) .

LMT 是根据引用位置的经纬度计算的。它与当时该地区可能使用的计时方式无关。在许多使用旧日期的情况下,没有可用的历史信息来了解那么久以前的时间究竟是如何保存的。

换句话说,您的 1899 年示例日期来自巴西已知计时实践之前的时期,因此改为应用本地平均时间。

使用更现代的日期,按照今天的标准,您应该会得到对您来说更有意义的结果。

关于datetime - 处理日期/时间和时区的奇怪时间偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57296496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com