问题描述
我试图了解Vegalite中的日期解析如何工作。具体来说,我对默认时区假设和从非时区表示为字符串的日期解析的理解有些困惑。
考虑可行的最小示例
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json","data": {
"values": [
{"date": "2020-10-01","distance": 1},{"date": "2020-11-01","distance": 5}
]
},"mark": "bar","encoding": {
"x": {"field": "date","type": "temporal","timeUnit": {"unit": "yearmonthdate","utc": true},"axis": {"format": "%b. %y"}
},"y": {"field": "distance","aggregate": "sum"}
}
}
在上面的示例中,如果我省略了该行(或只是省略了utc
标志):
"timeUnit": {"unit": "yearmonthdate","utc": true}
日期似乎被解析为:
Wed,30 Sep 2020 05:00:00 GMT
Sat,31 Oct 2020 05:00:00 GMT
任何有关默认假设的指导或解释都将非常有帮助。我从文档中了解到,在给定非ISO字符串输入的情况下,Vega会将时间解析为本地(https://vega.github.io/vega-lite/docs/timeunit.html#utc),但这似乎不是这种情况吗?
谢谢
解决方法
关于Vega / Vega-Lite如何处理日期,有两件重要的事情要知道:
- 日期始终以当地时间显示,除非另有说明(例如,将
"utc": true
传递给timeUnit) - 使用标准的JavaScript日期解析来解析日期。
为什么#2重要?好吧,因为Javascript日期解析假定不同的时区取决于输入日期的格式,并且使用的时区甚至可能取决于您使用的浏览器! (比您想在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#Description了解更多的信息)
摘要如下:完整的ISO日期字符串(在所有浏览器上)都将解析为本地时间(我在设置为PDT的计算机上运行了此时间):
> new Date("2020-10-01T00:00:00")
Thu Oct 01 2020 00:00:00 GMT-0700 (Pacific Daylight Time)
而部分日期或时间戳(在大多数浏览器中)将被解析为UTC时间:
> new Date("2020-10-01")
Wed Sep 30 2020 17:00:00 GMT-0700 (Pacific Daylight Time)
这意味着,如果要将非ISO时间字符串传递给Vega-Lite,则必须在轴上使用UTC时间单位,以便在vega / vega-lite图表中查看数据的正确表示形式。否则,日期将以UTC时间进行解析并以本地时间显示,其偏移量等于用于查看可视化效果的浏览器的时区偏移量。