Heidisql: 错误的时间戳显示为网格中的日期值

创建于 2018-01-31  ·  5评论  ·  资料来源: HeidiSQL/HeidiSQL

在网格视图选项中设置“这是 UNIX 时间戳列”处于活动状态,以将 UNIX 时间戳视为日期表示。

预期行为

以下(unix 时间戳)值在数据库中存储为 BIGINT:
1098655200
格林威治标准时间:2004 年 10 月 24 日星期日晚上 10:00:00
柏林:2004 年 10 月 25 日星期一上午 12:00:00 GMT+02:00 DST

网格应显示在此处:
2004-10-24 22:00:00 (GMT) 或
2004-11-25 00:00:00 (本地)

当前行为

网格显示:
2004-10-24 23:00:00

似乎是使用瞬时时区来显示值,这是德国今天(2018-01-31)的 GMT+1,没有夏令时。
值必须根据指定日期的时区显示,即 GMT+2,启用夏令时。

重现步骤

  1. 创建一个 BIGINT 列并插入一个值 1098655200
  2. 将“网格视图选项”设置为“这是一个 UNIX 时间戳列”
  3. 你会得到:2004-10-24 23:00:00
  4. 预计:2004-11-25 00:00:00

语境

  • HeidiSQL 版本:9.5.0.5196
  • 数据库系统+版本:MariaDB 10.2.12
  • 操作系统:Windows 10,Timezone Europe/Berlin

所有5条评论

@mpaland ,您的 MariaDB 正在以正确的时区欧洲/柏林运行?
我不处理很多转换,时间戳写入 UTC,不是吗? 和 MySQL 转换为您的时区?

我试图重现,但在我拥有的服务器上没有安装时区:(

@lukinhaspm这不是服务器的问题,这只是 HeidiSQL 中正确时间戳表示的问题。 UNIX TIMESTAMP 总是意味着在 1970-01-01 00:00:00 UTC 之后的秒数。

您可以严格以 UTC 格式显示这样的时间戳,这很好,或者在某个(主要是自己的)时区中显示。 这样做,需要时间戳记的日期有效的时区,而不是实际的日期。
HeidiSQL 似乎采用了实际日期。 我还没有查看它的代码,所以这只是一个猜测。

@mpaland我理解并同意!

我进一步调查了这一点。 不幸的是,解决方案似乎并不容易。
问题是世界各地复杂的 DST(夏令时)规则,更糟糕的是它们不断变化的、非恒定的形式。
要为某个纪元时间戳校正本地时间 DST,有必要知道在时间戳时间本地应用的确切 DST 规则。
转换库需要跟踪多年来每个国家/地区的所有 DST 规则更改,以计算过去任何时间点的偏移量。
Windows 完全忽略了这个问题,并始终根据转换时的 _actual_ DST 规则进行转换。
要做到这一点,有必要使用网络上真正先进的时区/DST 库之一。

尽管@mpaland所说的关于需要知道在创建时间戳时应用的 DST 规则的大部分内容在技术上是正确的(例如,如果我们

1584975600 和 1585576800 在欧洲/马德里都是 16:00,但 heidisql 错误地代表了其中之一(取决于我们是否在夏令时)

只需检查结果时间是否应该在夏令时并应用正确的偏移量,就可以正确显示这些情况而不会造成很大麻烦。

尽管它不是一个完美的解决方案,但我想说它可能涵盖了大多数用例,并且边缘情况可能很容易被发现,它对开发人员验证某些事情的帮助比最终用户可靠的显示更重要。

此页面是否有帮助?
0 / 5 - 0 等级