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

2023-12-03

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

发布的第一期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 秒来自哪里,也不知道在使用来自单元格值的时间和日期(仅包含日期或仅时间)并且必须将它们混合时如何确保一致性。

这实在是令人困惑……


6分28秒来自当地时间(LMT) 圣保罗和 GMT 之间的偏移量。你可以在 TZDB 源中看到它:

# 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 年示例日期来自巴西已知计时实践之前的时期,因此将应用当地平均时间。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理日期/时间和时区的奇怪时间偏移 的相关文章

  • 获取当前时间/日期的时间戳

    我需要使用 PHP 的简单代码来使用 TIMESTAMP 获取当前日期 时间并将其插入数据库 我在数据库中有一个名为 ArrivalTime 的字段作为时间戳 EDIT
  • 有效地从 2 个数据帧中查找日期时间范围的重叠

    关于查找日期或时间范围的重叠存在一些问题 例如 https stackoverflow com questions 9044084 efficient date range overlap calculation in python 我用这
  • Clasp 无法创建新的 Apps 脚本

    我用这个终端命令克隆了一个应用程序脚本 clasp clone
  • javascript 对象是否像 Ruby 一样“开放”?

    在 Ruby 中 我可以使用与声明自己的语法相同的语法来添加和修改任何类 对象或方法的功能 因为 Ruby 有 开放类 JavaScript 是这样的吗 举个例子 就我而言 我想更改 Google Apps 脚本处理 URL 对象的方式 以
  • 如何在Python中测量时间?

    我想启动我的程序 测量程序启动的时间 然后等待几秒钟 按下按钮 K RIGHT 并测量按下按钮的时间 我正在使用 Pygame 来注册 Keydown 但在我下面的代码中它没有注册我的 Keydown 我在这里做错了什么 start tim
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • SQL:每天选择最接近特定时间的一条记录

    我有一张表存储某个时间点的值 CREATE TABLE values value DECIMAL datetime DATETIME 每一天可能有多个值 也可能某一天只有一个值 现在我想获取给定时间跨度 例如一个月 内最接近一天中给定时间的
  • Python strptime 解析没有世纪的年份:假设在今年之前?

    我正在解析 Python 2 7 中的一些日期时间字符串 使用datetime strptime 我想假设某个日期早于现在 但是 strptime 的 y操作员 https docs python org 2 library datetim
  • 通过 Google Apps 脚本发送电子邮件时出现问题

    我有时已经成功地通过 Google Apps 脚本发送电子邮件 但是 当我打开一个新的 Google Workspace 帐户并使用相同的代码将相同的内容发送到同一个接收者时 新帐户不起作用 我收到一条 消息已被阻止 的消息 电子邮件受保护
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 在 x 轴上操作日期 Pandas Matplotlib

    我有一组非常简单的数据 如下所示 我正在寻找一种方法来绘制此堆积条形图并格式化 x 轴 日期 使其从 1996 年 31 月 12 日开始 到 2016 年 31 月 12 日结束 增量为 365 天 我编写的代码绘制了每个日期 因此 x
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 删除 DateTime.ParseExact 的时区

    我正在尝试将字符串解析为具有以下格式的日期时间 日 日期 月 年 时间 上午 下午 时区 示例 美国东部时间 2011 年 12 月 1 日星期四晚上 8 30 我已经使用 DateTime ParseExact 和格式 dddd dd M
  • maxifs的Google Sheets数组公式[重复]

    这个问题在这里已经有答案了 大家好 我是一名长期支持者 读者 但这是我第一次在 Stackoverflow 上发帖 所以请耐心等待 我正在使用的工作表示例 https i stack imgur com tFQ2n png if E2 If
  • 使用 Google 脚本移动 Google Drive 中的文件

    我正在尝试使用通过 Google 表单发布的信息创建文档 然后在创建文档后 我想将该文档移至共享文件夹中以供人们查看 目前 我的脚本从 Google Forms 链接的电子表格中获取所有信息 使用该信息 我使用以下代码来创建文档 var t
  • Java SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 给出时区作为 IST

    我有 SimpleDateFormat 构造函数作为 SimpleDateFormat yyyy MM dd T HH mm ss Z 我正在解析字符串 2013 09 29T18 46 19Z 我读到这里 Z 代表GMT UTC时区 但是
  • Javascript 中的 OADate 到毫秒时间戳

    我尝试做与以下完全相反的事情 JavaScript 中 DateTime ToOADate 的等效项是什么 https stackoverflow com questions 7348805 what is equivalent of da
  • 从 UTC 转换为本地时区给出错误结果

    背景我需要将格式为 HH mm 的时间字符串从 UTC 转换为本地时区 例如 如果 UTC 时间为 09 00 则当地时间 斯德哥尔摩 欧洲 应提前两个小时 Problem当我将 09 00 UTC 转换为斯德哥尔摩 欧洲时间时 我得到 1
  • 计算从给定日期开始的月份中的第几天?

    我正在努力寻找一种简单有效的解决方案来计算每月的工作日 例如 如果给定日期是第一个星期一Monday 5th March 2018然后我想获取接下来 6 个月每个月第一个星期一的日期 例如 Monday 2nd April 2018 and
  • 如何使用 Google 文档附加脚本查看旧版本的代码

    我制作了一个可在 05 21 运行的附加组件 从那时到现在的某个时刻 它破裂了 旧代码不再出现在修订历史中 只能追溯到 05 22 我测试过version 1 并且它有效 这意味着它使用了正确的代码 我可以运行这个工作版本 但我不知道如何重

随机推荐

  • 如何使用 fwrite 将结构写入文件?

    我对 C 很陌生 并且在使用 fwrite 时遇到了麻烦 我正在寻找使用一个包含两个值的结构 struct keyEncode unsigned short key 2 unsigned short encoded 2 然后我在 main
  • 如何使用 Jax-RS 返回 Java List Json

    我想知道如何让方法返回 List 的 JSON 数组 例如 GET Produces application json public List
  • 使用 SQLAlchemy 表达式时 Dask read_sql_table 出错

    我正在尝试将 SQLAlchemy 表达式与 dask 的 read sql table 结合使用 以获取通过连接和过滤几个不同表创建的数据集 这文档表明这应该是可能的 下面的示例不包含任何联接 因为不需要它们来复制问题 我构建连接字符串
  • Facebook JS 影响 IE 中的 CSS/@font-face?

    我似乎注意到 Facebook 的 JS div div 似乎影响了我网站在 IE 中的 CSS 例如 假设标题使用 font1 正文使用 font2 有时 在 IE 中 所有字体都使用 font1 甚至交换 标题使用 font2 正文使用
  • 运行 selenium 时如何将参数传递给 google chrome?

    我希望能够在运行 selenium 时将参数传递给 google chrome 我怎样才能做到这一点 当我运行 selenium 时 我使用 Java 命令 Java jar selenium jar 如何将 no sandbox igno
  • 如何从 iOS 应用程序中将视频上传到 YouTube? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 在我的 iOS 应用程序中
  • 如何使用 python 从包含数千个文件的目录中复制前 100 个文件?

    我有一个巨大的目录 并且一直在更新 我试图使用 python 仅列出目录中最新的 100 个文件 我尝试使用 os listdir 但是当目录大小接近 1 00 000 个文件时 listdir 似乎崩溃了 或者我没有等待足够长的时间 我只
  • HashMap 中的键是否存在检查

    检查 HashMap 中的键是否存在总是必要的吗 我有一个包含 1000 个条目的 HashMap 我正在考虑提高效率 如果HashMap的访问非常频繁 那么每次访问时都检查键是否存在将导致很大的开销 相反 如果密钥不存在并因此发生异常 我
  • 如何在 ASP.NET MVC 中禁用会话状态?

    我想要一个非常轻量级的 ASP NET MVC 站点 其中包括删除尽可能多的常用 HttpModule 并禁用会话状态 但是 当我尝试执行此操作时 出现以下错误 The SessionStateTempDataProvider requir
  • 如何在 PHP 中第 n 次出现针时分割字符串?

    必须有一种快速有效的方法来在针的 第 n 次出现处分割 文本 字符串 但我找不到它 里面的功能还是比较齐全的PHP手册中的strpos注释 但这对于我的需要来说似乎有点多了 我有纯文本作为 string并想将其拆分为nth的发生 needl
  • 构造函数 ProcessBuilder(String, String, String) 未定义

    在同一个 IDE Eclipse 中 我有两个项目都有 ProcessBuilder builder new ProcessBuilder cmd exe c command 但在项目一中它没有显示编译错误 但在项目二中它显示编译错误两个
  • 在 Qt 中处理非常大的图像

    我无法让 Qt 处理超过 10 000X10 000 的图像 我正在处理每张大约 2GB 的巨大卫星图像 我考虑过使用内存映射 但图像仍然占用内存空间 QFile file c qt a ras file open QIODevice Re
  • python webbrowser.open(url)

    httpd make server 80 server webbrowser open url httpd serve forever 这可以跨平台工作 除非我在 putty ssh 终端上启动它 我如何欺骗控制台在单独的进程中打开 w3m
  • 为什么原始 numpy 数组在更改从它创建的另一个数组时会发生变化?

    我有一个 numpy 数组r当我用来创建另一个数组时r2从中取出并转动该新阵列r2为零它也改变了原始数组r 我搜索了类似的问题 但没有找到任何令人满意的答案 所以请考虑提出一个合适的答案 原始数组 gt gt gt r array 0 1
  • 从 python 程序中禁用哈希随机化

    从Python 3 3开始 哈希算法是非确定性的salted以避免某种攻击 这对于网络服务器来说很好 但在尝试调试程序时却很痛苦 每次运行脚本时 字典内容都会以不同的顺序迭代 一些早期版本的 python 有一个 R标记为enabling哈
  • 有什么理由在 C++03 中使用“auto”关键字吗?

    Note这个问题最初发布于 2009 年 在 C 11 被批准之前 在auto关键字发生了很大的变化 提供的答案涉及onlyC 03 的含义auto 这是指定的存储类 而不是 C 11 的含义auto 这是自动类型推导 如果您正在寻找有关何
  • unix下隐藏文件的正则表达式

    我正在寻找一个正则表达式来匹配以 开头的每个文件 在一个目录中 我正在使用 CMake 来自 CMake 文档 CMake 需要正则表达式 而不是 glob 并且想要忽略以点开头的每个文件 隐藏文件 但是 or 不起作用 奇怪的是 这有效
  • 使用 ScriptEngine (.NET 3.5) 在 C# 中执行 Selenium python 单元测试时遇到问题

    第一次海报 我正在转向关于堆栈溢出的第一个问题 因为我在尝试寻找答案时发现了很少的资源 我正在寻找从 C 应用程序执行 Selenium python 测试 我不想每次都编译 C Selenium 测试 我想利用 IronPython 脚本
  • 为什么 C++ 中 char 不被视为数字?

    我用 C 编写了一段代码 运行完美 我将其翻译为 C 那里给出了错误的输出 我有一个迭代 我将输入和迭代器变量都用作 char 以节省空间 但表现并不如预期 unsigned char repeat i cin gt gt repeat f
  • 处理日期/时间和时区的奇怪时间偏移

    我一直在尝试编写一些函数来根据谷歌电子表格上多个单元格的信息创建谷歌日历和谷歌日历事件 发布的第一期here日期部分已经得到解决 现在我在时间部分遇到问题 下面的代码 var ss SpreadsheetApp getActiveSprea