触发器中的夏令时更改(数据工厂 v2)

Daylight Saving Time Changes in Trigger (Data Factory v2)

如何在管道(数据工厂 v2)中设置触发器以将特定开始时间安排到夏令时更改的国家/地区?

根据 documentation,即使触发器有一个时区 属性,目前也只支持 UTC。当支持其他时区时,指定该时区将使触发器在当地时间触发。

我没有尝试过这个,它有点老套,但作为一种解决方法,你能不能改为每小时触发一次,然后将 UTC 触发时间传递给管道。然后你可以有另一个触发参数,它是你想要执行的时区和实际时间。

管道的第一步是调用 Azure 函数并将时间转换为本地时区(考虑夏令时)。如果结果时间与请求的时区小时匹配,则 IF 语句将退出或继续。

为了 time/cost/tech 债务的利益,我可能不会这样做 - 我会手动计算出差异并在夏令时更新时更新它。

我发现一个简单的解决方法是使用以下 if 条件启动您的管道。

if(Equals(addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH'),utcNow('HH')),true,false)

让我们将 if 分解为以下几行……

1. if(
2. Equals(
3. addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH')
4. ,utcNow('HH')
5. )
6. ,true,false)

在第 3 行中,我们获取当前 UTC 时间 (19:30) 并转换为 CST (15:30),加上 5 小时,然后只取小时值 19:30 >> 15:30 + 5:00 = 19

在第 4 行中,我们获取 UTC 时间戳并仅提取小时数 (HH),在本例中为 19。

最后,这被包裹在“等于”语句中……如果两个小时值相等则为真,否则为假。

如果为真,我们什么也不做,继续进行管道的下一步。如果为 false,则我们不再处于夏令时,我们等待一小时继续。我发现即使 UTC 和 CST 之间的差异跨越午夜,这仍然有效。

下面是json....

{
  "name": "If DST",
  "type": "IfCondition",
  "dependsOn": [],
  "userProperties": [],
  "typeProperties": {
    "expression": {
      "value": "@if(Equals(addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH'),utcNow('HH')),true,false)",
      "type": "Expression"
    },
    "ifFalseActivities": [
      {
        "name": "Wait 1 hour",
        "type": "Wait",
        "dependsOn": [],
        "userProperties": [],
        "typeProperties": {
          "waitTimeInSeconds": 3600
        }
      }
    ]
  }
}