QlikView 和时区

QlikView and timezones

为什么会显示两次相同的时间:

=Now() & ' ' & TimeZone() & '\n' & ConvertToLocalTime(Now(), 'UTC') & ' UTC'

这表明:

2017-04-08 07:53:27 GMT-08:00
2017-04-08 07:53:27 UTC

我正在尝试根据其开始时间戳是否为 "in the future" 来有条件地格式化枢轴 table 表达式。有问题的字段是正确的(ConvertToLocalTime([Start Time], 'UTC') 显示正确的时间戳),本地时间也是正确的,但我无法准确地将我本地的非 UTC 时间与来自不同时区的另一个时间进行比较。

从帮助文件中您会注意到这是将 UTC 或 GMT 时间戳转换为本地时间作为对偶值

所以用法如下:

=ConvertToLocalTime(UTC(), 'GMT-05:00')

以你的例子为例:

=ConvertToLocalTime(UTC(), TimeZone() ) & ' ' & TimeZone() & '\n' & UTC() & ' UTC'

帮助文件来源:http://help.qlik.com/en-US/qlikview/12.1/Subsystems/Client/Content/Scripting/DateAndTimeFunctions/converttolocaltime.htm

部分问题是我误读了 ConvertToLocalTime docs 的部分,即它需要 GMT 或 UTC 时间戳才能运行。 (我习惯了其他编程语言,时区存储在时间戳中或与时间戳一起存储,并且可以自动调整。)

另一个方面(原始问题中未说明)是 QV 依赖底层 OS 获取某些时区信息,我相信 Windows(因此 QV 桌面和QV 服务器)正在做一些奇怪的事情,我认为这是不正确的:尽管 UTC does not observe daylight savings time、Windows 为 "UTC" 和 "UTC+00:00" 提供了不同的时间。 (如果对此行为有合理的解释,请发表评论!)

ConvertToLocalTime(UTC())                      : 2017-04-20 10:12:17
ConvertToLocalTime(UTC(), "UTC")               : 2017-04-20 17:12:17
ConvertToLocalTime(UTC(), "UTC+00:00")         : 2017-04-20 18:12:17 (huh?)
ConvertToLocalTime(UTC(), "UTC+00:00", "True") : 2017-04-20 17:12:17

(上面的双引号表示文本,单引号表示实际的函数调用。)ConvertToLocalTime() 有第三个参数,ignore_dst 可以用来缓解这种情况,但是因为这是一个核选项,不能安全地应用于非 UTC 时区,我无法在没有其他几项检查的情况下以编程方式处理时区。

底线:QV 不存储带有时间戳的时区。也就是说,它依赖于程序员跟踪时间戳的来源并根据需要进行转换。这表明,如果曾经使用过时区或有疑问,所有数据都应存储在 "UTC" 中(而不是 "UTC+00:00"),以便 ConvertToLocalTime() 可用于轻松转换为其他时区。 (许多建议TZ best practices适用于此。)

相关:不是所有的数据库时间戳类型都被QV支持。例如,不支持SQL服务器的datetimeoffset,因此需要手动解析以保留时区并正确使用numeric/timestamp dual.