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'
部分问题是我误读了 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.
为什么会显示两次相同的时间:
=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'
部分问题是我误读了 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.