DateTime-Werte in Architekturflüssen und Sommerzeitberechnungen (DST)

Architect arbeitet nativ mit Coordinated Universal Time (UTC) für DateTime-Werte. Was die Konvertierung einer UTC DateTime in eine lokale DateTime für eine bestimmte Zeitzone betrifft, so müssen Flow-Autoren eine Logik innerhalb des Flows erstellen, um diese Konvertierung durchzuführen, da Architect derzeit keinen Zeitzonen-Datentyp enthält, der verwendet werden könnte, um einen Offset und eine Sommerzeit (DST) zu liefern.

Beachten Sie zum Beispiel, dass die Variable Flow.StartDateTimeUtc DateTime und die Funktion GetCurrentDateTimeUtc() DateTime-Werte in UTC zurückgeben. Architect bietet verschiedene Ausdrucksfunktionen und Operatoren, die einem Flow-Autor helfen, DateTime-Werte so zu manipulieren, dass sie den Bedürfnissen des Flow-Autors entsprechen. Eine häufige Frage von Flow-Autoren lautet: "Wie kann ich einen DateTime-Wert so konvertieren, dass er die UTC-Datumszeit in einer bestimmten Zeitzone widerspiegelt?", weil sie die Flow-Ausführung auf der Grundlage dieser lokalen Zeit ändern möchten. Diese Frage kann sich stellen, wenn Sie in einem Anrufablauf einen Anruf nur zwischen 9:00 und 17:00 Uhr Ortszeit an eine Warteschlange weiterleiten wollen.

Zu den Funktionen, die häufig verwendet werden, um einen Offset auf eine DateTime anzuwenden und einen resultierenden DateTime-Wert zurückzugeben, gehören:

  • AddHours
  • AddMinutes

Einige Operatoren können auch verwendet werden, um einen DateTime-Wert zu ändern. Verwenden Sie z. B. das +, um eine Dauer zu einer DateTime hinzuzufügen und eine resultierende DateTime zu erhalten.

Die folgenden Beispiele zeigen, wie ein lokaler Datumswert aus einer UTC-Datumszeit berechnet werden kann, und können entsprechend der besten Anpassung für Ihre Organisation geändert werden.

Bei diesem grundlegenden Ansatz kann ein Flussautor einen Offset in einer Flussstufenvariablen speichern und diesen auf die in den Flussberechnungen verwendeten UTC-DateTime-Werte anwenden. Im folgenden Beispiel wird der Offset in Flow.HourOffsetgespeichert:

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

Wenn eine Zeitzone vor- oder zurückspringt, ändern Sie den Wert in Flow.HourOffset und veröffentlichen Sie den Fluss erneut Diese einfache Logik kann für Ihr Unternehmen ausreichend sein. In einigen Zeitzonen, z. B. in Arizona und Hawaii, gibt es keinen Vorwärts- oder Rückwärtssprung, so dass ein fest kodierter Versatz ausreicht.

Darüber hinaus gibt es Zeitzonen, die nicht um eine Stunde, sondern um 30 Minuten vor- oder zurückgehen. Verwenden Sie in diesen Fällen AddMinutes anstelle von AddHours, um den entsprechenden Versatz anzuwenden. Wenn Sie eine lokale Zeit haben, die mit der Sommerzeit übereinstimmt, ändern Sie den Wert, der in der für den Offset verwendeten Variablen gespeichert ist, entsprechend, wenn die Zeit vor- oder zurückgeht. Im obigen Beispiel bedeutet das, den Wert in Flow.HourOffset zu ändern und den Fluss neu zu veröffentlichen, wenn die Zeit vor- oder zurückspringt.

Um zu vermeiden, dass der Fluss jedes Mal neu veröffentlicht werden muss, wenn die Zeitzone vor- oder zurückspringt, wie im vorherigen Beispiel, können Sie Auflistungsvariablen verwenden, um Offsets für eine Zeitzone zu berücksichtigen. Diese Option erfordert zwar anfangs mehr Arbeit, macht aber die Verwaltung von Offsets, die in Variablen auf der Ablaufebene gespeichert sind, überflüssig und bietet mehr Einfachheit als die Verwendung von Ausdrücken.

Diese Methode verwendet einen parallelen Array-Ansatz und speichert die gewünschten Offsets, die den Bias-Offset für eine Zeitzone mit einem UTC-DateTime-Wert berücksichtigen. In diesem Beispiel werden ganzzahlige Sammelvariablen für die Berechnung von DateTime-Werten für die östliche Zeitzone eingerichtet. 

Hinweis: Die Verschiebung beträgt -5 Stunden. Wenden Sie die Sommerzeitverzerrung manuell auf die Einträge in den Flow.LocalTimeZoneMinuteOffsetCollection-Elementen an, falls erforderlich.
Sammlungselemente Flow.UtcDateTimeCollection Flow.LocalTimezoneMinuteOffsetCollection
Posten 0 Sonntag, 13. März 2016 um 7:00 Uhr

-300 

Hinweis: -300 entspricht -300 Minuten oder -5 Stunden.

Posten 1 Sonntag, November 6, 2016 um 8:00 Uhr

-240

Hinweis: -240 entspricht -240 Minuten oder -4 Stunden. In diesem Fall nach Sonntag, dem 13. März 2016 um 7:00 Uhr morgens. UTC (der erste Artikel in der Sammlung) bis Sonntag, den 6. November 2016 um 8:00 Uhr morgens. UTC, sollte das System einen UTC-DateTime-Wert um -240 Minuten versetzen, um sicherzustellen, dass er in der richtigen Ortszeit ist.

Posten 2 Sonntag, 12. März 2017 um 7:00 Uhr -300
Punkt 3 Sonntag, November 5, 2017 um 8:00 Uhr -240
Posten 4 Sonntag, 11. März 2018 um 7:00 Uhr -300
Punkt 5 Sonntag, 4. November 2018 um 8:00 Uhr -240
Punkt 6 Sonntag, 10. März 2019 um 7:00 Uhr -300
Punkt 7 Sonntag, 3. November 2019 um 8:00 Uhr -240
Posten 8 Sonntag, 8. März 2020 um 7:00 Uhr -300
Posten 9* Sonntag, 1. November 2020 um 8:00 Uhr -240

* Fügen Sie weitere Einträge für Abrufbewegungen hinzu, die über das Jahr 2020 hinausgehen.

Bei dieser Sammlung handelt es sich um eine Reihe von UTC-DateTime-Werten, die angeben, wann die östliche Zeitzone vor- oder zurückspringt. Erstellen Sie nun eine Aufgabe, die bei der Initiierung eines Flusses nach einer Ortszeit sucht, die auf der Sommerzeit und der Zeitzone basiert:

  1. Bestimmen Sie den UTC-DateTime-Wert, für den der Autor des Flusses eine lokale DateTime erhalten möchte. Verwenden Sie z. B. eine Datenaktualisierungsaktion oder eine Flow.StartDateTimeUtc, um GetCurrentDateTimeUtc() in Flow.UtcDateTimeToCheck zu speichern, oder verwenden Sie in diesem Fall Flow.StartDateTimeUtc.
  2. Hinzufügen und Konfigurieren einer Schleifenaktion:
    1. Beginnen Sie bei Index 0 und durchlaufen Sie die Flow.UTCDateTimeCollection.
    2. Für den ersten in Flow.UTCDateTimeCollection gefundenen Wert, der größer oder gleich Flow.UtcDateTimeToCheckist, speichern Sie den entsprechenden Minuten-Offset aus dem gleichen Element-Index in Flow.LocalTimezoneMinuteOffsetCollection zu Flow.MinuteOffsetToApply.
  3. Wenn nach der Schleife Flow.MinuteOffsetToApplykein Wert zugewiesen wird, weisen Sie einen Standard-Minuten-Offset zu, z. B. 300. In diesem Fall hat der UTC-DateTime-Wert für die Zeitüberprüfung keinen Eintrag in der Variablen Flow.UtcDateTimeCollection , der größer oder gleich diesem Wert ist
  4. Verwenden Sie dann den folgenden Ausdruck, um die Ortszeit aus dem obigen Algorithmus zu erhalten:
    Flow.MyLocalDateTimeToUse = AddMinutes(Flow.UtcDateTimeToCheck, Flow.MinuteOffsetToApply)

Sie haben nun eine Ortszeit mit der entsprechenden Verzerrung, die Sie für Berechnungen verwenden können. Die angewandte Verzerrung basiert auf dem Nachschlagewert in der Sammlung Flow.LocalTimezoneMinuteOffset

Obwohl der Ansatz des Ausdrucks komplexer ist, erfordert diese Methode keine fest kodierten DateTime-Werte in einer Sammlung zusammen mit einer entsprechenden Offset-Integer-Sammlung. Allerdings können sich Ausdrücke als komplizierter erweisen, wenn es um die Anpassung einer bestimmten Zeitzone geht, vor allem, wenn das Vor- oder Zurückspringen einen Tageswechsel in den UTC-DateTime-Berechnungen bewirkt.

In diesem Beispiel springt die Zeitzone am zweiten Sonntag im März um 7:00 Uhr vor. UTC, und fällt unabhängig vom Jahr auf den ersten Sonntag im November um 8.00 Uhr zurück. Für die östliche Zeitzone bedeutet dies, dass während der Sommerzeit die UTC-Verschiebung -4 Stunden (oder -240 Minuten) und außerhalb der Sommerzeit -5 Stunden (oder -300 Minuten) beträgt. Das Ergebnis des Ausdrucks ist eine "lokale" DateTime mit dem entsprechenden Versatz zur UTC-DateTime von entweder -4 oder -5 Stunden. Um den DateTime-Wert zu berechnen:

  1. Fügen Sie eine Aktion Daten aktualisieren hinzu
  2. Fügen Sie in der Aktion Daten aktualisieren eine Aktualisierungsanweisung DateTime hinzu 
  3. Unter Variable Name, fügen Sie Flow.LocalDateTimehinzu.
  4. Unter Value To Assignwechseln Sie zum großen Ausdruckseditor und fügen den Ausdruck hinzu:
AddMinutes(Flow.StartDateTimeUtc,
     (
          If(Flow.StartDateTimeUtc >= GetDayOfWeekOccurrence(1,-1,Year(Flow.StartDateTimeUtc),3,1,0,0)
               and Flow.StartDateTimeUtc <= GetDayOfWeekOccurrence(1,-1,Year(Flow.StartDateTimeUtc),10,1,0,0),
               -240,
               -300)
     )
)

Die Logik dieses Ausdrucks bestimmt, ob Sie sich gerade in der Sommerzeit befinden, entsprechend dem zweiten Sonntag im März um 7:00 Uhr, wenn Sie vorspringen, und am ersten Sonntag im November um 8:00 Uhr, wenn Sie zurückfallen.

Der erste Parameter, der dem logischen If im obigen Ausdruck übergeben wird, stellt die Funktionalität zur Verfügung, um festzustellen, ob eine gegebene UTC DateTime in das DST-Fenster für die östliche Zeitzone fällt Legen Sie hiermit fest, ob der auf die DateTime anzuwendende Offset entweder 240 Minuten (-4 Stunden) oder -300 Minuten (-5 Stunden) betragen soll. Der Rest des Ausdrucks liefert die anzuwendenden Werte. Wenn Sie einen booleschen Ausdruck benötigen, der wahr ist, wenn die Sommerzeit eingeschaltet ist, oder falsch, wenn sie nicht eingeschaltet ist, extrahieren Sie diese Logik in einen separaten Ausdruck, da sie einen booleschen Ausdruck zurückgibt:

(
      (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
        )
      )
    )
        
Hinweis: Alle Bewegungsarten können die Aktionen Zeitplan auswerten und Zeitplangruppe auswerten verwenden. Die Verwendung einer Zeitplangruppe bietet den Autoren von Abläufen die Flexibilität, Berechnungen als einfachere Alternative für die Arbeit mit UTC-Offsets, Sommerzeitvor- und -rücksprungverhalten usw. zu erstellen.