Architect 流程和夏令时 (DST) 计算中的 DateTime 值

Architect 本地使用协调世界时 (UTC) 来处理日期时间值。 关于将 UTC DateTime 转换为特定时区的本地 DateTime,流程作者必须在流程中构建逻辑才能执行此转换,因为 Architect 当前不包括可用于提供偏移量和夏令时 (DST) 偏差的时区数据类型。

例如,请注意, flow.startDateTimeutc 日期时间 变量和 getCurrentDateTimeutc () 函数返回 UTC 格式的日期时间值。 Architect 提供了各种表达式函数和运算符来帮助流程作者操纵 DateTime 值以满足流程作者的需求。 流程作者的一个常见问题是 “如何转换 DateTime 值以使其反映特定时区的 UTC DateTime?”因为他们想根据当地时间更改流程执行情况。 在呼叫流中,当您只想在当地时间上午 9:00 至下午 5:00 之间将呼叫路由到队列时,可能会出现此问题。

通常用于将偏移量应用于 DateTime 并返回结果 DateTime 值的函数包括:

  • addhours
  • add 分钟

某些运算符还可用于更改 DateTime 值。 例如,使用 + 向 DateTime 添加持续时间并获取生成的 DateTime。

以下示例显示了从 UTC DateTime 计算本地 DateTime 值的方法,可以根据最适合组织的值进行修改。

在这种基本方法中,流程作者可以将偏移量存储在流程级别变量中,然后将其应用于流程计算中使用的 UTC DateTime 值。 在以下示例中,偏移量存储在 F low.Houroffset 中

Flow.LocalDateTime = AddHours(GetCurrentDateTimeUtc(), Flow.HourOffset)

当时区向前或后退时,更改 F low.Houroffset 中的值, 然后重新发布流程。 这种简单的逻辑对你的组织来说可能已经足够 有些时区(例如亚利桑那州和夏威夷州)不会向前或后退,因此硬编码偏移量就足够了。

此外,某些时区向前或向后弹 30 分钟,而不是一个小时。 在这些情况下,使用 addMinutes 而不是 addDours 来应用适当的偏移量。 如果您有处理 DST 的本地时间,请在时间向前或后退时酌情更改用于偏移量的变量中存储的值。 在上面的示例中,这意味着更改 Flow.Houroffset 中的值,并在时间向前或后退时重新发布流程。

为避免在时区向前或后退时重新发布流程的任务,如前面的示例所示,您可以使用集合变量来考虑时区的偏移量。 虽然此选项最初需要做更多工作,但它消除了管理存储在流程级变量中的偏移量的需要,并且比使用表达式更加简单。

此方法使用并行数组方法,并保存所需的偏移量,这些偏移量考虑给定 UTC DateTime 值的时区的偏移量。 此示例是用于东部时区 DateTime 值计算的整数集合变量的设置。 

注意: 偏移量为 -5 小时。 根据需要手动将夏令时偏差应用于流程中的条目。localTimezonEminuteOffsetCollection 项目。
集合项 Flow.utcdatetimeCollection Flow.local 时区分钟偏移量集合
物品 0 2016 年 3 月 13 日星期日上午 7 点

-300 

注意: -300 代表 -300 分钟或 -5 小时。

项目 1 2016 年 11 月 6 日星期日上午 8 点

-240

注意: -240 代表 -240 分钟或 -4 小时。 在这种情况下,在 2016 年 3 月 13 日星期日上午 7 点之后。 UTC(系列中的第一件商品)直到 2016 年 11 月 6 日星期日上午 8 点 UTC 时,系统应将 UTC DateTime 值偏移 -240 分钟,以确保该值在正确的本地时间。

项目 2 2017 年 3 月 12 日星期日上午 7 点 -300
项目 3 2017 年 11 月 5 日星期日上午 8 点 -240
项目 4 2018 年 3 月 11 日星期日上午 7 点 -300
项目 5 2018 年 11 月 4 日星期日上午 8:00 -240
项目 6 2019 年 3 月 10 日星期日上午 7 点 -300
项目 7 2019 年 11 月 3 日星期日上午 8 点 -240
项目 8 2020 年 3 月 8 日星期日上午 7 点 -300
项目 9* 2020 年 11 月 1 日星期日上午 8 点 -240

* 为 2020 年以后的通话流量添加更多条目。

此集合是一组 UTC DateTime 值,用于在东部时区向前或向后弹出时使用。 现在,构建一个任务,当流程启动时,会根据夏令时和时区考虑因素查找本地时间:

  1. 确定流程作者希望获取本地 DateTime 的 UTC DateTime 值。 例如,使用 “更新数据” 操作或 Flow.startDateTimeutc 将 getCurrentDateTimeutc () 保存到 flow.utcdateTimeutc (),或者在这种情况下,使用 flow.startDateTimeutc
  2. 添加并配置循环操作:
    1. 从索引 0 开始,循环浏览 Flow.utcDateTimeCollection
    2. 对于在 flow.utcdatetimeTimeCollection 中找到的第一个 大于或等于 flow.utcdateTimeTimetoCheck 的值,请将 Flow.LocalTimezonEminuteOffsetCollection 中相应的分钟偏移量保存 到 F low 中。要应用的分钟偏移量
  3. 循环之后,如果没有为 flow.minuteOffsetToApply 分配任何值,请分配默认的分钟偏移量;例如 300。 在这种情况下,用于检查时间的 UTC DateTime 值在 flow.utcdateTimeCollection 变量中没有大于或等于该值的条目。
  4. 接下来,使用以下表达式从上述算法中获取本地时间:
    Flow.MyLocalDateTimeToUse = AddMinutes(Flow.UtcDateTimeToCheck, Flow.MinuteOffsetToApply)

现在,您有了一个本地时间,并对其应用了适当的偏差,可用于计算。 应用的偏差基于 flow.LocalTimezonEminuteOffset 集合中的查找值。

尽管表达式方法更复杂,但此方法不需要将硬编码的 DateTime 值连同相应的偏移整数集合一起输入到集合中。 但是,在调整特定时区时,表达式可能会变得更加复杂,特别是如果向前或后退会导致 UTC DateTime 计算发生一天变化。

在此示例中,时区在 3 月的第二个星期日上午 7:00 向前弹起。 UTC,无论年份如何,都会在 11 月的第一个星期日上午 8:00 回落。 使用东部时区,这意味着在夏令时期间,UTC 偏移量为 -4 小时(或 -240 分钟),如果不在夏令时,UTC 偏移量为 -5 小时(或 -300 分钟)。 表达式结果是一个 “本地” DateTime,在 UTC DateTime 中添加了 -4 或 -5 小时的适当偏移量。 要计算 DateTime 值:

  1. 添加 “ 更新数据 ” 操作。
  2. 在 “更新数据” 操作中,添加 DateTime 更新语句。 
  3. 变量名称下,添加 Flow.localDateTime
  4. 在 “要分配的 值” 下,切换到大型表达式编辑器并添加表达式:
AddMinutes(Flow.StartDateTimeUtc,
     (
          If(Flow.StartDateTimeUtc >= GetDayOfWeekOccurrence(1,2,Year(Flow.StartDateTimeUtc),3,1,0,0)
               and Flow.StartDateTimeUtc <= GetDayOfWeekOccurrence(1,1,Year(Flow.StartDateTimeUtc),11,1,0,0),
               -240,
               -300)
     )
)

此表达式中的逻辑确定您当前是否在夏令时,根据 3 月的第二个星期日上午 7:00(当您向前推进时)和 11 月第一个星期日上午 8:00(当您回退时)来确定您当前是否在夏令时。

上面表达式 中提交给逻辑 I f 的第一个参数提供了确定给定 UTC DateTime 是否落在东部时区的 DST 窗口中的功能。 使用它来确定应用于 DateTime 的偏移量是 240 分钟(-4 小时)还是 -300 分钟(-5 小时)。 表达式的其余部分提供要应用的值。 如果你需要一个在 DST 开启时计算结果为 true 的布尔表达式,或者在不启用时计算结果为 false 的布尔表达式,请将此逻辑提取到单独的表达式中,因为它返回一个布尔值:

(
      (Month(Flow.UtcDateTime) > 3)
        or
      (Month(Flow.UtcDateTime) == 3 and Month(AddDays(Flow.UtcDateTime, -7)) == 3 and Month(AddDays(Flow.UtcDateTime, -14)) == 3)
        or
      (
        (Month(Flow.UtcDateTime) == 3 and Month(AddDays(Flow.UtcDateTime, -7)) == 3 and Month(AddDays(Flow.UtcDateTime, -14)) == 2)
          and
        (DayOfWeek(Flow.UtcDateTime) > 1 or (Hour(Flow.UtcDateTime) >= 7))
      )
    )
    and
    (
      (Month(Flow.UtcDateTime) < 11)
        or
      (
        (Month(Flow.UtcDateTime) == 11 and Month(AddDays(Flow.UtcDateTime, -7)) == 10)
          and
        (
          (DayOfWeek(Flow.UtcDateTime) == 1 and Hour(Flow.UtcDateTime) < 8)
            or
          DayOfWeek(Flow.UtcDateTime)!=1
        )
      )
    )
        
注意: 所有流程类型都可以使用 “ 评估计划” 和 “ 评估计划” 组 操作。 使用计划组使流程作者可以灵活地创建计算,这是处理 UTC 偏移、DST 向前和回退行为等的更简单替代方法。