时区变化

导航至

作为一种处理时间序列数据的语言,Flux 在我们理解数据的方式中起着重要作用。当我们创建和处理数据时,我们是为了自己和他人。

时间和我们人类与时间互动的概念并非总是简单。我们大多数人每年至少要调整两次日程以适应夏令时,有时我们还必须以更复杂的方式调整时钟,因为出于重要的政治、文化或经济原因,我们需要将时钟调整到特定时间,例如跳过一天

Flux 在时区支持之前

Flux 是一种用于时间序列数据的语言,直到最近,Flux 还无法理解这些细微之处。Flux 会在 UTC 中完成所有工作,这是一个简单的线性时钟,并留给用户去弄清楚如何显示。这在大多数情况下都很好用!这正是 Flux 应该做的!Flux 不应该参与确定显示时区的正确方式。InfluxDB UI 完全有能力比 Flux 更好地解决这个问题。在诸如监控服务器的情况下,UTC 是完美的,应该优于特定时区使用。

但是……当我们开始为其他目的聚合数据时会发生什么?如果我想按天、周或月聚合,并且出于商业原因,我希望这些聚合在我自己的时区中进行,该怎么办?我不住在英国,即使我住在英国,英国也不是全年都使用 UTC 时间。我可以假装并记住我的聚合并不总是 100% 准确,并且它们“足够好”。有时“足够好”还不够好。在这些情况下,我可以更接近地通过使用偏移量将时间转移到我的时区。但是,当夏令时发生时,我可能会回到按时间“足够好”的聚合。

Flux 中的时区支持

Flux 现在为那些需要在特定时区内执行聚合的用户提供完整的时区支持。

要启用时区,请导入 timezone 包并将 location 选项设置为您的位置……默认情况下,Flux 使用 UTC 时区。

import "timezone"

option location = timezone.location(name: "America/Los_Angeles")

设置 location 选项后,window()aggregateWindow() 函数将变为位置感知,并利用动态偏移来考虑时钟向前或向后移动。这样,您可以在查询中使用以下任一项

from(bucket: "mybucket")
  |> range(start: -1y)
  |> filter(fn: ...)
  |> aggregateWindow(every: 1mo, fn: mean)

from(bucket: "mybucket")
  |> range(start: -1mo)
  |> filter(fn: ...)
  |> aggregateWindow(every: 1d, fn: mean)

这两者都将始终导致时间在指定时区的午夜开始和停止。

当时钟向前跳跃或向后移动时,时间窗口将缩小或拉伸以适应偏移量的变化。

为了对等性,也可以在 location 选项中指定固定偏移量。

import "timezone"

option location = timezone.fixed(offset: -8h)

这将时区设置为固定偏移量 -8 小时。此固定偏移量的工作方式与 UTC 相同,但午夜始终比 UTC 午夜晚 8 小时。

在更复杂的情况下,我们可能需要混合时区,或者仅对 `window` 函数的单个调用使用时区。我们可以为此使用参数,而不是全局选项。

import "timezone"

option location = timezone.location(name: "America/Los_Angeles")

from(bucket: "mybucket")
  |> range(start: -1y)
  |> filter(fn: ...)
  |> aggregateWindow(
    every: 1h,
    fn: mean,
    timeSrc: "_start",
    location: timezone.utc, // overrides the global option to use utc
  )
  |> aggregateWindow(every: 1w, fn: max) // global option is used

我们希望此功能将为在 Flux 中处理时间序列数据启用许多新的用例。