TTimeZone v Delphi XE

vložil Radek Červinka 11. října 2010 01:13

Delphi XE obsahuje v RTL podporu pro práci s lokální časovou zónou (TTimeZone). Implementace je multiplatformní (Windows, Linux, Mac OS) a je jednoduše použitelná.

  TTimeZone = class abstract
  private
    class var FLocal: TTimeZone;
…
  public
    function GetUtcOffset(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): TTimeSpan; inline;
    function ToUniversalTime(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): TDateTime; inline;
    function ToLocalTime(const ADateTime: TDateTime): TDateTime;
    function GetDisplayName(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): string;
    function GetAbbreviation(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): string;
    function GetLocalTimeType(const ADateTime: TDateTime): TLocalTimeType; inline;
    function IsStandardTime(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): Boolean;
    function IsInvalidTime(const ADateTime: TDateTime): Boolean; inline;
    function IsAmbiguousTime(const ADateTime: TDateTime): Boolean; inline;
    function IsDaylightTime(const ADateTime: TDateTime; 
          const ForceDaylight: Boolean = False): Boolean;
    property ID: string read DoGetID;
    property DisplayName: string read GetDisplayNameForNow;
    property Abbreviation: string read GetAbbreviationForNow;
    property UtcOffset: TTimeSpan read GetCurrentUtcOffset;
    class property Local: TTimeZone read FLocal;
  end;

Pro získání lokální časové zóny stačí jen napsat TTimeZone.Local, což ukáži na malém demu.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, TypInfo,
  DateUtils;
begin
  with TTimeZone.Local do
  begin
    writeln('Now:', DatetimeToStr(Now));
    writeln('UtcOffset (h):', GetUtcOffset(Now).Hours);
    writeln('Now ToUniversalTime :', DatetimeToStr(ToUniversalTime(Now)));
    // zpatky ToLocalTime
    writeln('GetDisplayName:', GetDisplayName(Now));
    writeln(GetDisplayName(EncodeDate(2010, 12, 1)));
    writeln('GetAbbreviation:', GetAbbreviation(Now));
    writeln('Aktuální čas je (letni / standardni): ',
      GetEnumName(TypeInfo(TLocalTimeType), Ord(GetLocalTimeType(Now))));
    //lttStandard, lttDaylight, lttInvalid, lttAmbiguous
    writeln('IsStandardTime:', IsStandardTime(Now));
    writeln('IsDaylightTime:', IsDaylightTime(Now));
    writeln('TimeZoneID:', ID);
    writeln('DisplayName:', DisplayName);
  end;
end.

Výsledek běhu je následující:

Now:11.10.2010 0:07:28
UtcOffset (h):2
Now ToUniversalTime :10.10.2010 22:07:28
GetDisplayName:Střední Evropa (letní čas)
Střední Evropa (běžný čas)
GetAbbreviation:GMT+02
Aktuální čas je (letni / standardni): lttDaylight
IsStandardTime:FALSE
IsDaylightTime:TRUE
TimeZoneID:Střední Evropa (běžný čas)
DisplayName:Střední Evropa (letní čas)

Snad jediné místo, které není jasné na první pohled je konstrukce ohledně GetLocalTimeType, kde použiji RTTI pro zobrazení názvu položky výčtového typu. Tento typ určující, zde se jedná o letní (lttDaylight) nebo zimní čas (lttStandard), navíc trošku překvapivě obsahuje hodnotu lttAmbiguous, která specifikuje čas v přechodu mezi časy v chybějící hodině a lttInvalid.

Tagy: ,

Novinky

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců