I was building out the initial functionality of a Python project in my local dev env. I was writing tests along the way to guard against regressions. Many of the tests assert things about time, durations, and formatted timestamps. All was well.
Then I was getting the project setup on GitHub with a CI workflow to run the test suite. And a ton of tests were failing. It was all the tests dealing with time. They were all off by 5 hours.
I recognized that time difference immediately. That's the difference between my
time here in Chicago and UTC. When I run the tests locally, they are all
formatted the timezone setting on my machine -- America/Chicago. Whereas when
I run them in this CI environment, they were suddenly being formatted to UTC.
What I needed to do was explicitly set the timezone that all the tests would always run in, regardless of environment.
I added the following to my conftest.py file:
import os
import time
# Set the timezone that all tests run in
os.environ["TZ"] = "America/Chicago"
time.tzset()First, I set the timezone (TZ) in os.environ to America/Chicago. That's a
copy of the executing environment that Python makes when it starts up.
Second, because TZ may be tied to some cached info under the hood, I have to
also run time.tzset().
Initialize, or reinitialize, the local timezone to the value stored in os.environ[‘TZ’]. The TZ environment variable should be specified in standard Unix timezone format as documented in the tzset man page (eg. ‘US/Eastern’, ‘Europe/Amsterdam’).
Now, all of my tests run reliably in America/Chicago.
To demonstrate all of this from the Python repl, here is an example:
>>> from datetime import datetime
>>> import os
>>> import time
>>> os.environ["TZ"] = "America/Los_Angeles"
>>> time.tzset()
>>> datetime.now()
datetime.datetime(2026, 8, 15, 14, 3, 19, 373682)
>>> os.environ["TZ"] = "America/Chicago"
>>> time.tzset()
>>> datetime.now()
datetime.datetime(2026, 8, 15, 16, 3, 33, 322803)Notice the two hour difference between those two.