Valores de fecha y hora en los cálculos de flujos de arquitecto y horario de verano (DST)

El arquitecto se ocupa de forma nativa de la hora universal coordinada (UTC) para los valores de fecha y hora. Con respecto a la conversión de una fecha y hora UTC en una fecha y hora local para una zona horaria específica, los autores de flujo deben crear una lógica dentro del flujo para realizar esta conversión, ya que Architect no incluye actualmente un tipo de datos de zona horaria que pueda usarse para proporcionar una compensación y el horario de verano. (DST) sesgo.

Por ejemplo, observe que el Flow.StartDateTimeUtc DateTime variable y la GetCurrentDateTimeUtc () función devuelve valores de fecha y hora en UTC. Architect ofrece varias funciones y operadores de expresión para ayudar a un autor de flujo a manipular los valores de fecha y hora para satisfacer las necesidades de un autor de flujo. Una pregunta común de los autores de flujo es "¿Cómo puedo convertir un valor de fecha y hora para que refleje la fecha y hora UTC en una zona horaria específica?" porque quieren cambiar la ejecución del flujo en función de esa hora local. Esta pregunta puede surgir cuando, en un flujo de llamadas, solo desea enrutar una llamada a una cola entre las 9:00 a. M. Y las 5:00 p. M., Hora local.

Las funciones que se usan comúnmente para aplicar un desplazamiento a un DateTime y devolver un valor DateTime resultante incluyen:

  • AddHours
  • Agregar minutos

Algunos operadores también se pueden utilizar para cambiar un valor de fecha y hora. Por ejemplo, use + para agregar una duración a una fecha y hora y obtener también una fecha y hora resultante.

Los siguientes ejemplos muestran formas de calcular un valor de fecha y hora local a partir de una fecha y hora UTC y se pueden modificar según la mejor opción para su organización.

En este enfoque básico, un autor de flujo puede almacenar un desplazamiento en una variable de nivel de flujo y aplicarlo a los valores de fecha y hora UTC utilizados en los cálculos de flujo. En el siguiente ejemplo, el desplazamiento se almacena en Flow.HourOffset:

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

Cuando una zona horaria avanza o retrocede, cambie el valor en Flow.HourOffset y vuelva a publicar el flujo. Esta simple lógica puede ser suficiente para su organización. Algunas zonas horarias; por ejemplo, Arizona y Hawái, no avanzan ni retroceden, por lo que un desplazamiento codificado es suficiente.

Además, algunas zonas horarias avanzan o retroceden 30 minutos, en lugar de una hora. En esos casos, use AddMinutes en lugar de AddHours para aplicar el desplazamiento apropiado. Si tiene una hora local que se ocupa de DST, cambie el valor almacenado en la variable utilizada para el desplazamiento según corresponda cuando el tiempo se adelanta o retrocede. En el ejemplo anterior, eso significa cambiar el valor en Flow.HourOffset y volver a publicar el flujo cuando el tiempo avanza o retrocede.

Para evitar la tarea de volver a publicar el flujo cada vez que la zona horaria avanza o retrocede, como en el ejemplo anterior, puede utilizar variables de colección para considerar las compensaciones de una zona horaria. Si bien esta opción requiere más trabajo inicialmente, elimina la necesidad de administrar compensaciones almacenadas en variables de nivel de flujo y ofrece más simplicidad que el uso de expresiones.

Este método utiliza un enfoque de matriz paralela y guarda las compensaciones deseadas que consideran la compensación de sesgo para una zona horaria dada un valor de fecha y hora UTC. Este ejemplo es una configuración de variables de recopilación de enteros para cálculos de valores de fecha y hora de la zona horaria del este. 

Nota: La compensación es de -5 horas. Aplique manualmente el sesgo del horario de verano a las entradas de los elementos Flow.LocalTimeZoneMinuteOffsetCollection según corresponda.
Artículo de colección Flow.UtcDateTimeCollection Flow.LocalTimezoneMinuteOffsetCollection
Elemento 0 Domingo 13 de marzo de 2016 a las 7:00 AM

-300 

Nota: -300 representa -300 minutos o -5 horas.

Objeto 1 Domingo, 6 de noviembre de 2016 a las 8:00 AM

-240

Nota: -240 representa -240 minutos o -4 horas. En este caso, después del domingo 13 de marzo de 2016 a las 7:00 am UTC (el primer artículo de la colección) hasta el domingo 6 de noviembre de 2016 a las 8:00 a. M. UTC, el sistema debe compensar un valor de fecha y hora UTC en -240 minutos, lo que garantiza que esté en la hora local correcta.

Elemento 2 Domingo, 12 de marzo de 2017 a las 7:00 AM -300
Ítem 3 Domingo, 5 de noviembre de 2017 a las 8:00 AM -240
Ítem 4 Domingo, 11 de marzo de 2018 a las 7:00 AM -300
Tema 5 Domingo, 4 de noviembre de 2018 a las 8:00 AM -240
Ítem 6 Domingo, 10 de marzo de 2019 a las 7:00 AM -300
Tema 7 Domingo, 3 de noviembre de 2019 a las 8:00 AM -240
Ítem 8 Domingo, 8 de marzo de 2020 a las 7:00 AM -300
Elemento 9 * Domingo, 1 de noviembre de 2020 a las 8:00 AM -240

* Agregue más entradas para los flujos de llamadas que se ejecutan después del año 2020.

Esta colección es un conjunto de valores de fecha y hora UTC para cuando la zona horaria del este se adelanta o retrocede. Ahora, cree una tarea que, cuando se inicia un flujo, busque una hora local en función del horario de verano y las consideraciones de la zona horaria:

  1. Determine el valor de fecha y hora UTC para el que el autor del flujo desea obtener una fecha y hora local. Por ejemplo, use una acción Actualizar datos o Flow.StartDateTimeUtc para guardar GetCurrentDateTimeUtc () en Flow.UtcDateTimeToCheck, o en este caso, use Flow.StartDateTimeUtc.
  2. Agregue y configure una acción de bucle:
    1. Comenzando en el índice 0, recorra el Flow.UTCDateTimeCollection.
    2. Para el primer valor encontrado en Flow.UTCDateTimeCollection Mayor qué o igual a Flow.UtcDateTimeToCheck, guarde la compensación de minutos correspondiente del mismo índice de artículo en Flow.LocalTimezoneMinuteOffsetCollection para Flow.MinuteOffsetToApply.
  3. Después del ciclo, si no se asigna ningún valor a Flow.MinuteOffsetToApply, asigne una compensación de minutos predeterminada; por ejemplo, 300. En esta situación, el valor de fecha y hora UTC para comprobar la hora no tiene una entrada mayor o igual en el Flow.UtcDateTimeCollection variable.
  4. A continuación, use la siguiente expresión para obtener la hora local del algoritmo anterior:
    Flow.MyLocalDateTimeToUse = AddMinutes(Flow.UtcDateTimeToCheck, Flow.MinuteOffsetToApply)

Ahora tiene una hora local con el sesgo apropiado aplicado que puede usar para los cálculos. El sesgo aplicado se basa en el valor de búsqueda en el Flow.LocalTimezoneMinuteOffset colección.

Aunque el enfoque de expresión es más complejo, este método no requiere valores de DateTime codificados de forma rígida en una colección junto con una colección de enteros de desplazamiento correspondiente. Sin embargo, las expresiones pueden resultar más complicadas cuando se adapta una zona horaria en particular, especialmente si avanzar o retroceder provoca un cambio de día en los cálculos de fecha y hora UTC.

En este ejemplo, la zona horaria avanza el segundo domingo de marzo a las 7:00 a. M. UTC, y retrocede el primer domingo de noviembre a las 8:00 a. M., Independientemente del año. Usando la zona horaria del este, esto significa que durante el horario de verano, la diferencia de UTC es de -4 horas (o -240 minutos) y cuando no está en DST, la diferencia de UTC es de -5 horas (o -300 minutos). El resultado de la expresión es un DateTime “local” con el desplazamiento apropiado agregado al DateTime UTC de -4 o -5 horas. Para calcular el valor de DateTime:

  1. Agregar un Actualizar datos acción.
  2. En la acción Actualizar datos, agregue un Fecha y hora declaración de actualización. 
  3. Debajo Nombre de la variable, agregar Flow.LocalDateTime.
  4. Debajo Valor para asignar, cambie al editor de expresiones grandes y agregue la expresión:
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)
     )
)

La lógica de esta expresión determina si está actualmente en horario de verano, de acuerdo con el segundo domingo de marzo a las 7:00 a. M. Cuando avanza, y el primer domingo de noviembre a las 8:00 a. M. Cuando retrocede.

El primer parámetro enviado a la lógica Si en la expresión anterior proporciona la funcionalidad para determinar si una fecha y hora UTC determinada cae en la ventana DST para la zona horaria del este. Utilice esto para determinar si la compensación que se aplicará a la fecha y hora debe ser 240 minutos (-4 horas) o -300 minutos (-5 horas). El resto de la expresión proporciona los valores a aplicar. Si necesita tener una expresión booleana que se evalúe como verdadera cuando DST está activada, o falsa cuando no lo está, extraiga esta lógica en una expresión separada, ya que devuelve un valor booleano:

(
      (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
        )
      )
    )
        
Nota: Todos los tipos de flujo pueden utilizar Evaluar horario y Evaluar grupo de programación comportamiento. El uso de un grupo de programación ofrece a los autores de flujo la flexibilidad de crear cálculos como una alternativa más fácil para trabajar con compensaciones UTC, comportamiento de avance y retroceso del horario de verano, etc.