Skip to content

Instantly share code, notes, and snippets.

@bero
Created July 19, 2021 05:32
Show Gist options
  • Save bero/c11895ad405d76f1f182ec40e8dff151 to your computer and use it in GitHub Desktop.
Save bero/c11895ad405d76f1f182ec40e8dff151 to your computer and use it in GitHub Desktop.
Some ugly code for daylight saving
function HasNoDaylightTime(aAddress: TAbstractAddress): Boolean;
begin
Result := (aAddress.CountryAlias = 'af') or
(aAddress.CountryAlias = 'dz') or
(aAddress.CountryAlias = 'as') or
(aAddress.CountryAlias = 'ao') or
(aAddress.CountryAlias = 'ai') or
(aAddress.CountryAlias = 'ag') or
(aAddress.CountryAlias = 'ar') or
(aAddress.CountryAlias = 'am') or
(aAddress.CountryAlias = 'aw') or
(aAddress.CountryAlias = 'az') or
(aAddress.CountryAlias = 'bh') or
(aAddress.CountryAlias = 'bd') or
(aAddress.CountryAlias = 'bb') or
(aAddress.CountryAlias = 'by') or
(aAddress.CountryAlias = 'bz') or
(aAddress.CountryAlias = 'bj') or
(aAddress.CountryAlias = 'bt') or
(aAddress.CountryAlias = 'bo') or
(aAddress.CountryAlias = 'bw') or
(aAddress.CountryAlias = 'io') or
(aAddress.CountryAlias = 'vg') or
(aAddress.CountryAlias = 'bn') or
(aAddress.CountryAlias = 'bf') or
(aAddress.CountryAlias = 'bi') or
(aAddress.CountryAlias = 'cv') or
(aAddress.CountryAlias = 'kh') or
(aAddress.CountryAlias = 'cm') or
(aAddress.CountryAlias = 'bq') or
(aAddress.CountryAlias = 'ky') or
(aAddress.CountryAlias = 'cf') or
(aAddress.CountryAlias = 'td') or
(aAddress.CountryAlias = 'cn') or
(aAddress.CountryAlias = 'cx') or
(aAddress.CountryAlias = 'cc') or
(aAddress.CountryAlias = 'co') or
(aAddress.CountryAlias = 'km') or
(aAddress.CountryAlias = 'cg') or
(aAddress.CountryAlias = 'cd') or
(aAddress.CountryAlias = 'ck') or
(aAddress.CountryAlias = 'cr') or
(aAddress.CountryAlias = 'ci') or
(aAddress.CountryAlias = 'cw') or
(aAddress.CountryAlias = 'dj') or
(aAddress.CountryAlias = 'dm') or
(aAddress.CountryAlias = 'do') or
(aAddress.CountryAlias = 'tl') or
(aAddress.CountryAlias = 'ec') or
(aAddress.CountryAlias = 'eg') or
(aAddress.CountryAlias = 'sv') or
(aAddress.CountryAlias = 'gq') or
(aAddress.CountryAlias = 'er') or
(aAddress.CountryAlias = 'et') or
(aAddress.CountryAlias = 'fk') or
(aAddress.CountryAlias = 'gf') or
(aAddress.CountryAlias = 'pf') or
(aAddress.CountryAlias = 'tf') or
(aAddress.CountryAlias = 'ga') or
(aAddress.CountryAlias = 'gm') or
(aAddress.CountryAlias = 'ge') or
(aAddress.CountryAlias = 'gh') or
(aAddress.CountryAlias = 'gd') or
(aAddress.CountryAlias = 'gp') or
(aAddress.CountryAlias = 'gu') or
(aAddress.CountryAlias = 'gt') or
(aAddress.CountryAlias = 'gn') or
(aAddress.CountryAlias = 'gw') or
(aAddress.CountryAlias = 'gy') or
(aAddress.CountryAlias = 'ht') or
(aAddress.CountryAlias = 'hn') or
(aAddress.CountryAlias = 'hk') or
(aAddress.CountryAlias = 'is') or
(aAddress.CountryAlias = 'in') or
(aAddress.CountryAlias = 'id') or
(aAddress.CountryAlias = 'iq') or
(aAddress.CountryAlias = 'jm') or
(aAddress.CountryAlias = 'jp') or
(aAddress.CountryAlias = 'kz') or
(aAddress.CountryAlias = 'ke') or
(aAddress.CountryAlias = 'ki') or
(aAddress.CountryAlias = 'kw') or
(aAddress.CountryAlias = 'kg') or
(aAddress.CountryAlias = 'la') or
(aAddress.CountryAlias = 'ls') or
(aAddress.CountryAlias = 'lr') or
(aAddress.CountryAlias = 'ly') or
(aAddress.CountryAlias = 'mo') or
(aAddress.CountryAlias = 'mg') or
(aAddress.CountryAlias = 'mw') or
(aAddress.CountryAlias = 'my') or
(aAddress.CountryAlias = 'mv') or
(aAddress.CountryAlias = 'ml') or
(aAddress.CountryAlias = 'mh') or
(aAddress.CountryAlias = 'mq') or
(aAddress.CountryAlias = 'mr') or
(aAddress.CountryAlias = 'mu') or
(aAddress.CountryAlias = 'yt') or
(aAddress.CountryAlias = 'fm') or
(aAddress.CountryAlias = 'ms') or
(aAddress.CountryAlias = 'mz') or
(aAddress.CountryAlias = 'mm') or
(aAddress.CountryAlias = 'nr') or
(aAddress.CountryAlias = 'np') or
(aAddress.CountryAlias = 'nc') or
(aAddress.CountryAlias = 'ni') or
(aAddress.CountryAlias = 'ne') or
(aAddress.CountryAlias = 'ng') or
(aAddress.CountryAlias = 'nu') or
(aAddress.CountryAlias = 'nf') or
(aAddress.CountryAlias = 'kp') or
(aAddress.CountryAlias = 'mp') or
(aAddress.CountryAlias = 'om') or
(aAddress.CountryAlias = 'pk') or
(aAddress.CountryAlias = 'pw') or
(aAddress.CountryAlias = 'pa') or
(aAddress.CountryAlias = 'pg') or
(aAddress.CountryAlias = 'pe') or
(aAddress.CountryAlias = 'ph') or
(aAddress.CountryAlias = 'pn') or
(aAddress.CountryAlias = 'pr') or
(aAddress.CountryAlias = 'qa') or
(aAddress.CountryAlias = 're') or
(aAddress.CountryAlias = 'ru') or
(aAddress.CountryAlias = 'rw') or
(aAddress.CountryAlias = 'sh') or
(aAddress.CountryAlias = 'kn') or
(aAddress.CountryAlias = 'lc') or
(aAddress.CountryAlias = 'mf') or
(aAddress.CountryAlias = 'vc') or
(aAddress.CountryAlias = 'st') or
(aAddress.CountryAlias = 'sa') or
(aAddress.CountryAlias = 'sn') or
(aAddress.CountryAlias = 'sc') or
(aAddress.CountryAlias = 'sl') or
(aAddress.CountryAlias = 'sg') or
(aAddress.CountryAlias = 'sx') or
(aAddress.CountryAlias = 'sb') or
(aAddress.CountryAlias = 'so') or
(aAddress.CountryAlias = 'za') or
(aAddress.CountryAlias = 'gs') or
(aAddress.CountryAlias = 'kr') or
(aAddress.CountryAlias = 'ss') or
(aAddress.CountryAlias = 'lk') or
(aAddress.CountryAlias = 'bl') or
(aAddress.CountryAlias = 'sd') or
(aAddress.CountryAlias = 'sr') or
(aAddress.CountryAlias = 'sz') or
(aAddress.CountryAlias = 'tw') or
(aAddress.CountryAlias = 'tj') or
(aAddress.CountryAlias = 'tz') or
(aAddress.CountryAlias = 'th') or
(aAddress.CountryAlias = 'tg') or
(aAddress.CountryAlias = 'tk') or
(aAddress.CountryAlias = 'tt') or
(aAddress.CountryAlias = 'tn') or
(aAddress.CountryAlias = 'tm') or
(aAddress.CountryAlias = 'tc') or
(aAddress.CountryAlias = 'tv') or
(aAddress.CountryAlias = 'ug') or
(aAddress.CountryAlias = 'ae') or
(aAddress.CountryAlias = 'uy') or
(aAddress.CountryAlias = 'um') or
(aAddress.CountryAlias = 'vi') or
(aAddress.CountryAlias = 'uz') or
(aAddress.CountryAlias = 'vu') or
(aAddress.CountryAlias = 've') or
(aAddress.CountryAlias = 'vn') or
(aAddress.CountryAlias = 'wf') or
(aAddress.CountryAlias = 'ye') or
(aAddress.CountryAlias = 'zm') or
(aAddress.CountryAlias = 'zw');
end;
{ Same comment as HasNoDaylightTime }
function HasEuropeanDaylightTime(aAddress: TAbstractAddress): Boolean;
begin
Result := (aAddress.CountryAlias = 'ad') or
(aAddress.CountryAlias = 'al') or
(aAddress.CountryAlias = 'at') or
(aAddress.CountryAlias = 'ba') or
(aAddress.CountryAlias = 'be') or
(aAddress.CountryAlias = 'bg') or
(aAddress.CountryAlias = 'ch') or
(aAddress.CountryAlias = 'cz') or
(aAddress.CountryAlias = 'de') or
(aAddress.CountryAlias = 'dk') or
(aAddress.CountryAlias = 'ee') or
(aAddress.CountryAlias = 'es') or
(aAddress.CountryAlias = 'fi') or
(aAddress.CountryAlias = 'fo') or
(aAddress.CountryAlias = 'fr') or
(aAddress.CountryAlias = 'gi') or
(aAddress.CountryAlias = 'gg') or
(aAddress.CountryAlias = 'gr') or
(aAddress.CountryAlias = 'hr') or
(aAddress.CountryAlias = 'hu') or
(aAddress.CountryAlias = 'ie') or
(aAddress.CountryAlias = 'im') or
(aAddress.CountryAlias = 'it') or
(aAddress.CountryAlias = 'je') or
(aAddress.CountryAlias = 'lb') or
(aAddress.CountryAlias = 'li') or
(aAddress.CountryAlias = 'lt') or
(aAddress.CountryAlias = 'lu') or
(aAddress.CountryAlias = 'lv') or
(aAddress.CountryAlias = 'mc') or
(aAddress.CountryAlias = 'md') or
(aAddress.CountryAlias = 'me') or
(aAddress.CountryAlias = 'mk') or
(aAddress.CountryAlias = 'mt') or
(aAddress.CountryAlias = 'nl') or
(aAddress.CountryAlias = 'no') or
(aAddress.CountryAlias = 'pl') or
(aAddress.CountryAlias = 'pt') or
(aAddress.CountryAlias = 'ro') or
(aAddress.CountryAlias = 'rs') or
(aAddress.CountryAlias = 'se') or
(aAddress.CountryAlias = 'si') or
(aAddress.CountryAlias = 'sk') or
(aAddress.CountryAlias = 'sm') or
(aAddress.CountryAlias = 'tr') or
(aAddress.CountryAlias = 'uk') or
(aAddress.CountryAlias = 'va') or
(aAddress.CountryAlias = 'xk');
end;
// Converts UTC time to local time
function UTCTimeToLocalTime(aUTCTime: TDateTime; aAddress: TAbstractAddress): TDateTime;
var
vYear, vMonth, vDay : Word;
vOffset: Integer;
begin
vOffset := aAddress.TimeZoneOffset;
DecodeDate(DateOf(aUTCTime), vYear, vMonth, vDay);
if HasEuropeanDaylightTime(aAddress) then
begin
if ((vMonth > 3) and (vMonth < 10)) or ((vMonth = 3) and (vDay >= GetDaylightStartEurope(aUTCTime))) or ((vMonth = 10) and (vDay <= GetDaylightEndEurope(aUTCTime))) then
inc(vOffset);
end
else if not HasNoDaylightTime(aAddress) then
raise Exception.Create('Error: The address is located in a country that has a daylight saving time not currently handled by Attracs.');
Result := aUTCTime + vOffset / 24;
end;
// Converts local time to UTC time
function LocalTimeToUTCTime(aLocalTime: TDateTime; aAddress: TAbstractAddress): TDateTime;
var
vYear, vMonth, vDay : Word;
vOffset: Integer;
begin
vOffset := aAddress.TimeZoneOffset;
DecodeDate(DateOf(aLocalTime), vYear, vMonth, vDay);
if HasEuropeanDaylightTime(aAddress) then
begin
if ((vMonth > 3) and (vMonth < 10)) or ((vMonth = 3) and (vDay >= GetDaylightStartEurope(aLocalTime))) or ((vMonth = 10) and (vDay <= GetDaylightEndEurope(aLocalTime))) then
inc(vOffset);
end
else if not HasNoDaylightTime(aAddress) then
raise Exception.Create('Error: Address is located in a country that has a daylight saving time not currently handled by Attracs');
Result := aLocalTime - vOffset / 24;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment