尽管表达式方法更复杂,但此方法不需要将硬编码的 DateTime 值连同相应的偏移整数集合一起输入到集合中。 但是,在调整特定时区时,表达式可能会变得更加复杂,特别是如果向前或后退会导致 UTC DateTime 计算发生一天变化。
在此示例中,时区在 3 月的第二个星期日上午 7:00 向前弹起。 UTC,无论年份如何,都会在 11 月的第一个星期日上午 8:00 回落。 使用东部时区,这意味着在夏令时期间,UTC 偏移量为 -4 小时(或 -240 分钟),如果不在夏令时,UTC 偏移量为 -5 小时(或 -300 分钟)。 表达式结果是一个 “本地” DateTime,在 UTC DateTime 中添加了 -4 或 -5 小时的适当偏移量。 要计算 DateTime 值:
- 添加 “ 更新数据 ” 操作。
- 在 “更新数据” 操作中,添加 DateTime 更新语句。
- 在 变量名称下,添加 Flow.localDateTime。
- 在 “要分配的 值” 下,切换到大型表达式编辑器并添加表达式:
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
)
)
)