为什么两次显示同一时间:
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时间与来自不同时区的其他时间进行比较。
答案 0 :(得分:1)
在帮助文件中,您会注意到这是将UTC或GMT时间戳转换为本地时间作为双值
所以用法如下:
=ConvertToLocalTime(UTC(), 'GMT-05:00')
对于你的例子:
=ConvertToLocalTime(UTC(), TimeZone() ) & ' ' & TimeZone() & '\n' & UTC() & ' UTC'
答案 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
,因此需要手动解析以保留时区并正确使用数字/时间戳对偶。