Přepočet času UTC na aktuální místní čas CET nebo letní CEST

Údaje o čase jsou v databázích SCOMu zapisované ve světovém univerzálním čase UTC, výjimkou je databáze OperationsManagerAC, která může časové údaje zaznamenávat buď ve formátu UTC nebo při instalaci zvolíme místní časové pásmo CET (tj. UTC+1). To je výhodné, pokud jsou v databázi všechny záznamy od serverů z jednoho časového pásma. Druhou výhodou je, že se nemusíme starat o změny při přechodu na letní čas a zpět.

CET   ->   CEST   ->   CET
nebo (UTC + 1   ->   UTC + 2   ->   UTC + 1)

V reportech, které vytvářím pomocí Visual Studia (SQL Server Bussines Inteligence Development Studio) můžeme zajistit ve výstupu přepočet časových údajů na aktuální čas našeho pásma CET (central european time, UTC+1) i v době platnosti letního času CEST (central european summer time, UTC+2) použitím kódu Visual Basic. Po zjištění aktuálního času v UTC je skriptem přidána jedna hodina nebo dvě hodiny v době platnosti letního času:


PublicFunction DateTimeUTC2Local(ByVal od As String) As Date 

Dim offset, i As Integer
Dim startDST, endDST As Date
Dim nd As String
offset = 1
' find last Sunday in March
For i = 31 To 25 Step -1
  If Weekday( "3/" & i & "/" & Year(od)) = 1 Then
    startDST = DateAdd("h", 1, CDate("3/" & i & "/" & Year(od)))
    Exit For
  End If
Next
' find last Sunday in October
For i = 31 To 25 Step -1
  If Weekday( "10/" & i & "/" & Year(od)) = 1 Then
    endDST = DateAdd("h", 1, CDate("10/" & i & "/" & Year(od)))
    Exit For
  End If
Next
' add hour to offset if within DST
If CDate(od) >= startDST And CDate(od) < endDST Then
  offset = offset + 1
End If
nd = DateAdd("h", offset, od)
Return nd
End Function

Použití kódu VBS v nástroji SQL Server Bussines Inteligence Development Studio:

Pokračujeme konfigurací z nabídky Report | Report Properties. Zde na záložce General vyplníme popis reportu (autor, popis). Na záložce Code vložíme kód, který použijeme při přepočítávání časového údaje:

Pro použití kódu v reportu, v poli které z databáze vybere čas ve formátu UTC, vypočítáme platný místní čas CET / CEST takto:
například čas, získaný dotazem z databáze OperationsManager ve sloupci Alert.TimeRaised – ve výstupním formuláři použijeme v příslušném sloupci následující výraz pro výpočet (Expression) s uvedením výše definované funkce:
=Code.DateTimeUTC2Local(Fields!TimeRaised.Value)


ReportBuilder

Potřebujeme-li podobnou funkčnost reportu zajistit také z editačního prostředí nástroje ReportBuilder, nemůžeme použít vlastní kód (alespoň mi to není známo – použití ReportBuilderu verze 2.0 a 3.0 jsem ještě nezkoumal).

Kód musíme napsat přímo do formátovacího pole, implementace výše uvedeného algoritmu by byla příliš složitá, proto postupuji takto:

  1. zjistím datum přechodu na letní čas a zpět pro aktuální období pro data v databázi,
  2. v příslušném sloupci při vytváření vzorce pro výpočet uvedu vzorec.
    Příklad: vstupní čas (LogonTime) je ve formátu UTC,
    přechod z letního času CEST na standardní CET je poslední neděli v říjnu v 1:00 hodin UTC,
    přechod na letní času CEST ze standardního CET je poslední neděli v březnu ve 3:00 hodin UTC, definice výrazu je tedy pro současné období:

 


IF(LogonTime < DATETIME(2010;10;31;1;0;0);
   DATEADD(HOUR;2;LogonTime); //přidat 2 hodiny, letní čas CEST
   IF(LogonTime < DATETIME(2011;3;27;1;0;0);
      DATEADD(HOUR;1;LogonTime); //přidat 1 hodiny, standardní čas CET
      DATEADD(HOUR;2;LogonTime) //přidat 2 hodiny, letní čas CEST
   )
)


 

6 komentářů u „Přepočet času UTC na aktuální místní čas CET nebo letní CEST

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *