减去不同时区的日期时间

Posted

技术标签:

【中文标题】减去不同时区的日期时间【英文标题】:Subtract datetimes in different timezones 【发布时间】:2014-09-21 04:46:49 【问题描述】:

我被要求创建一个查询以从 Informix 数据库中提取近乎实时的报告(我只有选择访问权限,我无法创建 SP),我觉得我成功了,直到我意识到有日期时间字段中的差异。似乎填充数据库的程序是硬编码的,以便在 UTC 的日期时间字段中输入时间(比本地时间晚 5 小时。当时间是 2:30 时,它在数据库中输入一行说 John Doe 7点30分完成任务)。在我的报告中,我应该计算自用户完成任务(字段为“completionTime”)以来的秒数(作为整数),而我最初只是使用:

sysdate - completionTime interval seconds(9) to seconds cast to char then cast to int

当我意识到完成时间字段的时区错误时,我只是将偏移量减去一个整数(我已经将间隔转换为整数,所以我只是将答案调整了 18000)。这工作得很好,直到夏令时开始。然后突然之间,本地时间与 UTC 相差 4 小时(14400 秒而不是 18000 秒)。

由于我只能从数据库中选择,接下来我尝试使用低效的 case 语句(我的查询从

这种方法有效,但计算对我来说看起来很糟糕:

cast(cast(cast((sysdate - dbinfo("utc_to_datetime", cast(cast(cast((completionTime - TO_DATE('Friday January 1, 2010 0:00', '%A %B %d, %Y %R')) as interval second(9) to second) as char(10)) as int)  +1262304000)) as interval second(9) to second) as char(10)) as int)

请注意,我正在计算从完成时间到 2010 年 1 月 1 日的时间长度,然后添加 120 亿秒(一直回到 unix 纪元对于 Informix 的间隔 seconds(9) 到秒来说太大了,因此两步),以便我可以将其插入 dbinfo("utc_to_datetime") sp 以将其转换回正确时区的日期时间,然后从 sysdate 中减去它。最糟糕的部分(除了六个演员表)是我正在处理的完成时间都在 sysdate 的 24 小时内,大多数都在 10 分钟内,但我增加了 120 亿秒,以便我可以使用我唯一可以使用的功能发现在时区之间转换。

我的问题是,这真的是最好的方法吗?顺便说一句,这工作得很快,我的查询又回到了合理的执行时间(

贾里德

【问题讨论】:

一种更简单的方法是使用 UTC 或使用 Unix 时间戳执行所有计算(如果我们在闰秒期间忽略时间,那么很容易将一个转换为另一个)。如果完成时间以 UTC 给出,则不需要本地时间来计算用户完成任务以来的秒数,因此无需担心 DST 和 UTC 偏移。您应该能够轻松获取当前时间作为 UTC 时间或 Unix 时间戳。 好的,这是我的问题。你说,“你应该能够……”这就是我一直在想的——“我应该能够……”但我找不到任何方法来做到这一点。我能找到的任何获取当前时间的方法都会在本地时区返回它。有没有办法从 Informix 获取当前的 UTC 时间或 unix 时间戳?到目前为止,我还没有找到这个。 “有没有办法从 Informix 获取当前的 UTC 时间或 unix 时间戳?”——看起来是个好问题(如果没有,你可以单独问然而)。 【参考方案1】:

也许你可以用DBINFO('utc_current')代替sysdate

SELECT DBINFO('utc_current') - (completionTime interval seconds(9) to seconds) FROM ...

【讨论】:

以上是关于减去不同时区的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

具有相同时区但不同 utcoffset() 的日期时间对象

在具有正确日期的python中转换和计算日期时间对象的时区

具有相同时区信息的两个python日期时间对象的打印方式不同[重复]

将 UTC 日期和时间转换为 UNIX 时间会给出错误的(时区不同)值。为啥?

使用 Joda 的不同时区的日期之间的天数