Created
July 19, 2021 05:32
-
-
Save bero/c11895ad405d76f1f182ec40e8dff151 to your computer and use it in GitHub Desktop.
Some ugly code for daylight saving
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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