NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #170 most downloaded on PyPI
tzinfo object for the local timezone
Last release 3 months ago
29 Jun 2026
Release timing varies
gaps range from 2 weeks to 1.3 years
Nearly every release is documented
notes for 32 of 34 stable releases
2 versions withdrawn
withdrawn after publishing
14 years old
53 releases · first in 2012
Improved handling if you have a syntax error in /etc/clock.
Moved the tests back, removed the ones that check for symlinks. See issue #146
One column per quarter.
[Yanked for distribution issues]
[Yanked for distribution issues]
Open files with Zone names as ascii.
Open files with Zone names as ascii.
Moved tests under tzlocal/tests and include them in distributions.
Dropped support for Python 3.9 and added support for 3.14.
Now only warns bout /etc/timezone if it is actually conflicting with other timezone configurations.
Now supports Python 3.9 to 3.13, and no longer requires backports.zoneinfo.
Now supports Python 3.9 to 3.13, and no longer requires backports.zoneinfo.
Some distributions are for some reason removing support for /etc/timezone, which is bad, because that's the only place where the timezone is stated in plain text, and what's worse, they don't delete it. So we can't trust it now, so when we have multiple configs, we are forced to just ignore it.
Attempts to return a ZoneInfo object also for UTC.
Updated python versions [hugovk]
Added a pre-commit config
Updated python versions [hugovk]
Added type hints for the public functions
Moved to using pyproject.toml for project config.
The Unicode data doesn't change tz names when IANA does, so what is current in IANA is treated as an alias in Unicode data. This version handles that.
The logging info under windows made it look like it looked up the registry info even when you had a TZ environment, but it doesn't actually do that.
The logging info under windows made it look like it looked up the registry info even when you had a TZ environment, but it doesn't actually do that.
Improved the handling of loggers.
Fixed a bug in the new assert_tz_offset method.
Change how the system offset is calculated to deal with non-DST temporary changes, such as Ramadan time in Morocco.
Change how the system offset is calculated to deal with non-DST temporary changes, such as Ramadan time in Morocco.
Change the default to only warn when the timezone offset and system offset disagree (but still not even warn if TZ is set)
Add the assert_tz_offset() method to the top level for those who want to explicitly check and fail.
- Removed the deprecation shim.
- Added debug logging
Nothing published for this version
Improved the error message when the ZoneInfo cannot be found
Improved the error message when the ZoneInfo cannot be found
Don't error out because we find multiple possible timezones for a symlink.
More stable on Android/Termux with proot
If TZ environment variable is set to /etc/localhost, and that's a link to a zoneinfo file, then tzlocal will now find the timezone name, and not just
- No changes from 4.1b1.
It turns out a lot of Linux distributions make the links between zoneinfo aliases backwards, so instead of linking GB to Europe/London it actually lin
It turns out a lot of Linux distributions make the links between zoneinfo aliases backwards, so instead of linking GB to Europe/London it actually links the other way. When /etc/localtime then links to Europe/London, and you also have a config file saying Europe/London, the code that checks if /etc/localtime is a symlink ends up at GB instead of Europe/London and we get an error, as it thinks GB and Europe/London are different zones.
So now we check the symlink of all timezones in the uniqueness test. We still return the name in the config file, though, so you would only get GB or Zulu returned as the time zone instead of Europe/London or UTC if your only configuration is the /etc/localtime symlink, as that's checked last, and tzlocal will return the first configuration found.
The above change also means that GMT and UTC are no longer seen as synonyms, as zoneinfo does not see them as synonyms. This might be controversial, but you just have to live with it. Pick one and stay with it. ;-)
Improved the error message when you had a conflict including a /etc/localtime symlink.
A long time bug in Ubuntu docker images seem to not get fixed, so I added a workaround.
Handle UCT and Zulu as synonyms for UTC, while treating GMT and UTC as different.
- No changes.
Fixed a bug in the Windows DST support.
Added support for turning off DST in Windows. That only works in whole hour timezones, and honestly, if you need to turn off DST, you should just use
Returning pytz_deprecation_shim zones to lower the surprise for pytz users.
Returning pytz_deprecation_shim zones to lower the surprise for pytz users.
The Windows OS environment variable 'TZ' will allow an override for setting the timezone. The override timezone will be asserted for timezone validity bit not compared against the systems timezone offset. This allows for overriding the timezone when running tests.
Dropped support for Windows 2000, XP and Vista, supports Windows 7, 8 and 10.
Big refactor; Implemented get_localzone_name() functions.
Big refactor; Implemented get_localzone_name() functions.
Adding a Windows OS environment variable 'TZ' will allow an override for setting the timezone (also see 4.0b3).
Now finds and compares all the configs (under Unix-like systems) and tells you what files it found and how they conflict. This should make it a lot ea
Nothing published for this version
Modernized the packaging, moving to setup.cfg etc.
Modernized the packaging, moving to setup.cfg etc.
Handles if the text config files incorrectly is a TZ file. (revanSZ)
Switched timezone provider from pytz to zoneinfo (PEP 615)
- No changes.
The is_dst flag is wrong for Europe/Dublin on some Unix releases. I changed to another way of determining if DST is in effect or not.
The is_dst flag is wrong for Europe/Dublin on some Unix releases. I changed to another way of determining if DST is in effect or not.
Added support for Python 3.7 and 3.8. Dropped 3.5 although it still works.
Major differences since 1.5.1 .............................
Major differences since 1.5.1 .............................
When no time zone configuration can be find, tzlocal now return UTC. This is a major difference from 1.x, where an exception would be raised. This change is because Docker images often have no configuration at all, and the unix utilities will then default to UTC, so we follow that.
If tzlocal on Unix finds a timezone name in a /etc config file, then tzlocal now verifies that the timezone it fouds has the same offset as the local computer is configured with. If it doesn't, something is configured incorrectly. (Victor Torres, regebro)
Get timezone via Termux getprop wrapper on Android. It's not officially
supported because we can't test it, but at least we make an effort.
(Jean Jordaan)
Minor differences and bug fixes ...............................
Skip comment lines when parsing /etc/timezone. (Edward Betts)
Don't load timezone from current directory. (Gabriel Corona)
Now verifies that the config files actually contain something before reading them. (Zackary Welch, regebro)
Got rid of a BytesWarning (Mickaël Schoentgen)
Now handles if config file paths exists, but are directories.
Moved tests out from distributions
Support wheels
Nothing published for this version
Nothing published for this version
Nothing published for this version
1.5 had a bug that slipped through testing, fixed that, increased test coverage.
I use MIT on my other projects, so relicensing.
Dropping support for Python versions nobody uses (2.5, 3.1, 3.2), adding 3.6 Python 3.1 and 3.2 still works, 2.5 has been broken for some time.
Dropping support for Python versions nobody uses (2.5, 3.1, 3.2), adding 3.6 Python 3.1 and 3.2 still works, 2.5 has been broken for some time.
Ayalash's OS X fix didn't work on Python 2.7, fixed that.
Ensure closing of subprocess on OS X (ayalash)
Ensure closing of subprocess on OS X (ayalash)
Removed unused imports (jwilk)
Closes stdout and stderr to get rid of ResourceWarnings (johnwquarles)
Updated Windows timezones (axil)
- #34: Added support for /var/db/zoneinfo
- #30: Fixed a bug on OS X.
Tests failed if TZ was set in the environment. (EdwardBetts)
Tests failed if TZ was set in the environment. (EdwardBetts)
Replaces os.popen() with subprocess.Popen() for OS X to handle when systemsetup doesn't exist. (mckabi, cewing)
Systemd stores no time zone name, forcing us to look at the name of the file that localtime symlinks to. (cameris)
Nothing published for this version
Timezones that has 3 items did not work on Mac OS X. (Marc Van Olmen)
Timezones that has 3 items did not work on Mac OS X. (Marc Van Olmen)
Now doesn't fail if the TZ environment variable isn't an Olsen time zone.
Some timezones on Windows can apparently be empty (perhaps the are deleted). Now these are ignored. (Xiaokun Zhu)
I forgot to add Etc/UTC as an alias for Etc/GMT.
Adding better support for OS X.
Adding better support for OS X.
Added support to map from tzdata/Olsen names to Windows names. (Thanks to Benjamen Meyer).
Fixed some more cases where spaces needs replacing with underscores.
Fixed some more cases where spaces needs replacing with underscores.
Better handling of misconfigured /etc/timezone.
Better error message on Windows if we can't find a timezone at all.
Python 2.5 supported; because it only needed a __future__ import.
Windows 7 support.
Python 2.5 supported; because it only needed a future import.
Python 3.3 tested, it worked.
Got rid of relative imports, because I don't actually like them, so I don't know why I used them in the first place.
For each Windows zone, use the default zoneinfo zone, not the last one.
- Python 3 support.
- Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →