Frequently Asked Questions

Where are the "Etc/*" time zones?

According to IANA the "Etc/*" time zones are only included in the tz database for "historical reasons". Furthermore the time zones offsets provided the Etc/GMT±HH can be misleading. For example the Etc/GMT+4 time zone is 4 hours behind UTC rather than 4 hours ahead as most people expect. Since TimeZones.jl already provides an easy way of constructing fixed offset time zones using FixedTimeZone it was decided to only allow users to create these time zones if they explicitly ask for them.

julia> TimeZone("Etc/GMT+4")
ERROR: ArgumentError: The time zone "Etc/GMT+4" is of class `TimeZones.Class(:LEGACY)` which is currently not allowed by the mask: `TimeZones.Class(:FIXED) | TimeZones.Class(:STANDARD)`

julia> TimeZone("Etc/GMT+4", TimeZones.Class(:LEGACY))
Etc/GMT+4 (UTC-4)

Far-future ZonedDateTime with VariableTimeZone

Due to the internal representation of a VariableTimeZone it is infeasible to determine a time zones transitions to infinity. Since 2038-01-19T03:14:07 is the last DateTime that can be represented by an Int32 (Dates.unix2datetime(typemax(Int32))) it was decided that 2037 would be the last year in which all transition dates are computed. If additional transitions are known to exist after the last transition then a cutoff date is specified.

julia> warsaw = tz"Europe/Warsaw"
Europe/Warsaw (UTC+1/UTC+2)

julia> last(warsaw.transitions)
2037-10-25T01:00:00 UTC+1/+0 (CET)

julia> warsaw.cutoff  # DateTime up until the last transition is effective
2038-03-28T01:00:00

julia> ZonedDateTime(DateTime(2039), warsaw)
ERROR: UnhandledTimeError: TimeZone Europe/Warsaw does not handle dates on or after 2038-03-28T01:00:00 UTC

It is important to note that since we are taking about future time zone transitions and the rules dictating these transitions are subject to change and may not be accurate. If you still want to work with future ZonedDateTime past the default cutoff you can re-compile the TimeZone objects and specify the max_year keyword:

julia> using TimeZones

julia> TimeZones.TZData.compile(max_year=2200)

julia> ZonedDateTime(DateTime(2100), tz"Europe/Warsaw")
2100-01-01T00:00:00+01:00

Warning: since the tz string macro loads the TimeZone at compile time the time zone will be loaded before the tz data is recompiled. You can avoid this problem by using the TimeZone constructor.

julia> begin
           TimeZones.TZData.compile(max_year=2210)
           ZonedDateTime(DateTime(2205), tz"Europe/Warsaw")
       end
ERROR: UnhandledTimeError: TimeZone Europe/Warsaw does not handle dates on or after 2038-03-28T01:00:00 UTC

julia> begin
           TimeZones.TZData.compile(max_year=2220)
           ZonedDateTime(DateTime(2215), TimeZone("Europe/Warsaw"))
       end
2215-01-01T00:00:00+01:00