在网格视图选项中设置“这是 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,启用夏令时。
嘿@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 错误地代表了其中之一(取决于我们是否在夏令时)
只需检查结果时间是否应该在夏令时并应用正确的偏移量,就可以正确显示这些情况而不会造成很大麻烦。
尽管它不是一个完美的解决方案,但我想说它可能涵盖了大多数用例,并且边缘情况可能很容易被发现,它对开发人员验证某些事情的帮助比最终用户可靠的显示更重要。