我试图了解 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"}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,如果我省略了该行(或仅省略了utc标志):
"timeUnit": {"unit": "yearmonthdate", "utc": true}
Run Code Online (Sandbox Code Playgroud)
日期似乎被解析为:
Wed, 30 Sep 2020 05:00:00 GMT
Sat, 31 Oct 2020 05:00:00 GMT
Run Code Online (Sandbox Code Playgroud)
关于此处默认假设的任何指导或解释都将非常有帮助。我从给出非 ISO 字符串输入的文档中了解到,Vega 会将时间解析为本地(https://vega.github.io/vega-lite/docs/timeunit.html#utc),但这似乎不是这里的情况?
谢谢
关于 Vega/Vega-Lite 如何处理日期,有两件重要的事情需要了解:
"utc": true给 timeUnit),否则日期始终以本地时间显示为什么#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)
Run Code Online (Sandbox Code Playgroud)
而部分日期或时间戳(在大多数浏览器上)将被解析为 UTC 时间:
> new Date("2020-10-01")
Wed Sep 30 2020 17:00:00 GMT-0700 (Pacific Daylight Time)
Run Code Online (Sandbox Code Playgroud)
这意味着如果您将非 ISO 时间字符串传递给 Vega-Lite,您必须在轴上使用 UTC 时间单位,以便在 vega/vega-lite 图表中查看数据的正确表示。如果不这样做,日期将以 UTC 时间解析并以本地时间显示,从而导致偏移量等于用于查看可视化的浏览器的时区偏移量。