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.