QlikView和时区

时间:2017-04-08 14:57:13

标签: datetime qlikview datetimeoffset

为什么两次显示同一时间:

https://gist.github.com/anonymous/bf557b0fdb9e8c0f8a50b09c2e6eedbc

这表明:

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

我正在尝试根据其开始时间戳是“未来”来有条件地格式化数据透视表表达式。相关字段是正确的(2017-04-08 07:53:27 GMT-08:00 2017-04-08 07:53:27 UTC 显示正确的时间戳),本地时间也是正确的,但我无法准确地将本地非UTC时间与来自不同时区的其他时间进行比较。

2 个答案:

答案 0 :(得分:1)

在帮助文件中,您会注意到这是将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

答案 1 :(得分:0)

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

另一个方面(原始问题中没有说明)是QV依赖底层操作系统获取某些时区信息,我认为Windows(ergo,无论是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 Server的datetimeoffset,因此需要手动解析以保留时区并正确使用数字/时间戳对偶。