How can you check if a timezone is valid?

In Elixir core is there a function to check if a given timezone is valid?

I’m mainly looking at DateTime and Calendar but as far as I can tell they both don’t have a way to directly verify that a given String is a valid time zone.

I think there’s two options here:

  • A: Use a function like DateTime.now/1 and check if it returns {:error, :time_zone_not_found}
  • B: Directly use a time zone library like tz or tzdata

I suppose A is the way to go and is not that odd. But it does feel a little weird that there isn’t a way to directly check the validity of a timezone. And it looks like that function can only return two errors {:error, :time_zone_not_found | :utc_only_time_zone_database} so as long as I ensure that I setup my time zone database correctly I can use DateTime.now/1 to check the validity of a time zone.

There is probably going to be a “wasted” DateTime → Gregorian days conversion with DateTime.now approach. Not that it’s expensive, just feels “wrong” :slight_smile:

I don’t know about Tzdata, but for Tz there is GitHub - mathieuprog/tz_extra: A few utilities to work with time zones in Elixir which exports a TzExtra.time_zone_id_exists?/1 helper.

3 Likes

You eventually might need to provide a datetime for the check as well – given I expect the list to not be static over time. And at that point DateTime.from_naive kinda does what you need :slight_smile: