Flux 中的时区

导航至

作为处理时序数据的语言,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)

这两者都将始终在指定时区午夜开始和结束时间。

当时钟跳过或移动时,时间窗口将根据偏移量的变化而收缩或扩展以适应变化。

对于奇偶校验,位置选项中也可以指定一个固定的偏移量。

import "timezone"

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

这设置了具有-8小时固定偏移量的时区。这个固定偏移量与UTC相同,但午夜将始终在UTC午夜后8小时。

在更复杂的情况下,我们可能需要混合时区或只对窗口函数的单次调用使用时区。我们可以使用参数而不是全局选项来实现这一点。

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处理时间序列数据的新用例成为可能。