我的应用程序使用UTC的SQLite时间戳。这已经很好了很长时间。
但是现在我需要知道创建特定记录的时区。
我很高兴继续存储 UTC,但我需要使用原始区域向用户显示数据。
如果SQLite支持时区(+/-HHMM)的时间戳,则可以轻松实现。如果SQLite具有以"+/-HHMM"格式提取当前时区的能力,也可以轻松完成。
有没有办法从SQLite获取"当前"时区?或者获取包含时区的时间戳?
需要明确的是,我喜欢并想要UTC。这很好,但我还需要原始 TZ。如有必要,我很乐意将其存储在另一个字段中。如有必要,也很乐意存储两个日期字段。
编辑1:我能想到的最好的是:
select round(24*60*60*(julianday('now','localtime')-julianday('now')));
它确实会在几秒钟内产生偏移量,但繁琐且非标准。我喜欢一个"时区current_timestamp"类似物。
编辑2:在这一点上,我不确定为什么我要费心存储儒略偏移量,而不仅仅是代表当地时间的第二个日期字段。我想它可以节省几个字节,但仅此而已。
now
答案替换为所讨论的实际时间戳,您在答案中显示的方法是合理的。 换句话说,不要假设当前偏移量是所有时间戳的正确偏移量。
请注意,这只会为您提供当前计算机的时区偏移量。 由于SQLite经常与应用程序一起在进程中运行,这可能没问题。 但是,如果由于某种原因您的数据来自其他地方,则没有魔法可以回忆起数据来自哪个时区。
使用与 OP 相同的核心逻辑,使用 unixepoch
和 printf
进行格式化:
select printf("%.2d:00", (unixepoch('now','localtime')-unixepoch('now'))/(60*60)) as offset;
返回偏移量:
offset
------
-03:00