Architect 흐름 및 DST(일광 절약 시간제) 계산의 DateTime 값

Architect는 DateTime 값에 대해 기본적으로 UTC(협정 세계시)를 처리합니다. UTC DateTime을 특정 시간대의 로컬 DateTime으로 변환하는 것과 관련하여 흐름 작성자는 흐름 내부에 논리를 빌드하여 이 변환을 수행해야 합니다. Architect에는 현재 오프셋 및 일광 절약 시간을 제공하는 데 사용할 수 있는 시간대 데이터 유형이 포함되어 있지 않기 때문입니다. (DST) 편향.

예를 들어, Flow.StartDateTimeUtc 날짜 시간 변수와 GetCurrentDateTimeUtc() 함수는 UTC로 DateTime 값을 반환합니다. Architect는 흐름 작성자가 흐름 작성자의 요구에 맞게 DateTime 값을 조작할 수 있도록 다양한 표현식 함수와 연산자를 제공합니다. 흐름 작성자의 일반적인 질문은 "특정 시간대의 UTC DateTime을 반영하도록 DateTime 값을 어떻게 변환할 수 있습니까?"입니다. 현지 시간을 기준으로 흐름 실행을 변경하기를 원하기 때문입니다. 이 질문은 통화 흐름에서 현지 시간으로 오전 9시에서 오후 5시 사이에만 대기열로 통화를 라우팅하려는 경우에 나타날 수 있습니다.

DateTime에 오프셋을 적용하고 결과 DateTime 값을 반환하는 데 일반적으로 사용되는 함수는 다음과 같습니다.

  • 추가 시간
  • 분 추가

일부 연산자를 사용하여 DateTime 값을 변경할 수도 있습니다. 예를 들어 +를 사용하여 DateTime에 Duration을 추가하고 결과 DateTime도 가져옵니다.

다음 예는 UTC DateTime에서 로컬 DateTime 값을 계산하는 방법을 보여주며 조직에 가장 적합하도록 수정할 수 있습니다.

이 기본 접근 방식에서 흐름 작성자는 흐름 수준 변수에 오프셋을 저장하고 흐름 계산에 사용되는 UTC DateTime 값에 이를 적용할 수 있습니다. 다음 예에서 오프셋은 다음 위치에 저장됩니다. Flow.HourOffset:

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

표준 시간대가 앞으로 튀어나오거나 뒤로 빠지면 다음에서 값을 변경합니다. Flow.HourOffset 흐름을 다시 게시합니다. 이 간단한 논리로 조직에 충분할 수 있습니다. 일부 시간대; 예를 들어 아리조나와 하와이는 앞으로 튀어나오거나 뒤로 물러나지 않으므로 하드 코딩된 오프셋으로 충분합니다.

또한 일부 시간대는 1시간이 아닌 30분 앞당기거나 뒤로 물러납니다. 이러한 경우 AddHours 대신 AddMinutes를 사용하여 적절한 오프셋을 적용하십시오. DST를 처리하는 현지 시간이 있는 경우 오프셋에 사용된 변수에 저장된 값을 시간이 앞당기거나 뒤로 갈 때 적절하게 변경합니다. 위의 예에서 이는 Flow.HourOffset의 값을 변경하고 시간이 앞당기거나 뒤로 갈 때 흐름을 다시 게시하는 것을 의미합니다.

이전 예에서와 같이 표준 시간대가 앞당겨질 때마다 흐름을 다시 게시하는 작업을 피하기 위해 컬렉션 변수를 사용하여 표준 시간대에 대한 오프셋을 고려할 수 있습니다. 이 옵션은 초기에 더 많은 작업이 필요하지만 흐름 수준 변수에 저장된 오프셋을 관리할 필요가 없으며 표현식을 사용하는 것보다 더 단순합니다.

이 방법은 병렬 배열 방식을 사용하고 UTC DateTime 값이 주어진 시간대에 대한 편향 오프셋을 고려하여 원하는 오프셋을 저장합니다. 이 예는 동부 시간대 DateTime 값 계산을 위한 정수 수집 변수의 설정입니다. 

참고: 오프셋은 -5시간입니다. Flow.LocalTimeZoneMinuteOffsetCollection 항목의 항목에 일광 절약 시간 편향을 적절하게 수동으로 적용합니다.
컬렉션 항목 Flow.UtcDateTimeCollection Flow.LocalTimezoneMinuteOffsetCollection
항목 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시 -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 값 집합입니다. 이제 흐름이 시작될 때 DST 및 표준 시간대 고려 사항을 기반으로 현지 시간을 찾는 작업을 빌드합니다.

  1. 흐름 작성자가 로컬 DateTime을 가져오려는 UTC DateTime 값을 결정합니다. 예를 들어 데이터 업데이트 작업 또는 Flow.StartDateTimeUtc를 사용하여 GetCurrentDateTimeUtc()를 Flow.UtcDateTimeToCheck에 저장하거나 이 경우 다음을 사용합니다. Flow.StartDateTimeUtc.
  2. 루프 작업을 추가하고 구성합니다.
    1. 인덱스 0에서 시작하여 루프 Flow.UTCDateTimeCollection.
    2. 에서 찾은 첫 번째 값의 경우 Flow.UTCDateTimeCollection 크거나 같음 Flow.UtcDateTimeToCheck, 동일한 항목 인덱스에서 해당 분 오프셋을 저장합니다. Flow.LocalTimezoneMinuteOffsetCollection 에게 Flow.MinuteOffsetToApply.
  3. 루프 이후에 값이 할당되지 않은 경우 Flow.MinuteOffsetToApply, 기본 분 오프셋을 지정합니다. 예: 300. 이 상황에서 시간을 확인하기 위한 UTC DateTime 값은 Flow.UtcDateTimeCollection 변하기 쉬운.
  4. 다음으로 다음 표현식을 사용하여 위의 알고리즘에서 현지 시간을 가져옵니다.
    Flow.MyLocalDateTimeToUse = AddMinutes(Flow.UtcDateTimeToCheck, Flow.MinuteOffsetToApply)

이제 계산에 사용할 수 있는 적절한 편향이 적용된 현지 시간이 있습니다. 적용된 바이어스는 룩업 값을 기반으로 합니다. Flow.LocalTimezoneMinuteOffset 수집.

식 접근 방식이 더 복잡하지만 이 방법에서는 해당 오프셋 정수 컬렉션과 함께 컬렉션에 하드 코딩된 DateTime 값이 필요하지 않습니다. 그러나 특정 표준 시간대를 적용할 때 표현식이 더 복잡할 수 있습니다. 특히 앞으로 또는 뒤로 이동하여 UTC DateTime 계산에서 날짜가 변경되는 경우에는 더욱 그렇습니다.

이 예에서 표준 시간대는 3월 두 번째 일요일 오전 7시에 시작됩니다. UTC이며 연도에 관계없이 11월 첫 번째 일요일 오전 8시에 대체됩니다. 동부 표준시를 사용하면 DST 동안 UTC 오프셋이 -4시간(또는 -240분)이고 DST가 아닐 때 UTC 오프셋이 -5시간(또는 -300분)임을 의미합니다. 표현식 결과는 -4 또는 -5시간의 UTC DateTime에 적절한 오프셋이 추가된 "로컬" DateTime입니다. DateTime 값을 계산하려면:

  1. 추가 데이터 업데이트 동작.
  2. 데이터 업데이트 작업에서 다음을 추가합니다. 날짜 시간 업데이트 문. 
  3. 아래에 변수 이름, 추가하다 Flow.LocalDateTime.
  4. 아래에 할당할 가치, 큰 표현식 편집기로 전환하고 표현식을 추가하십시오.
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)
     )
)

이 표현식의 논리는 3월 두 번째 일요일 오전 7:00(스프링) 및 11월 첫 번째 일요일 오전 8:00(폴백)에 따라 현재 DST에 있는지 여부를 결정합니다.

논리에 제출된 첫 번째 매개변수 만약에 위의 식에서 지정된 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 스프링 포워드 및 폴백 동작 등으로 작업하기 위한 보다 쉬운 대안으로 계산을 생성할 수 있는 유연성이 제공됩니다.