sdispater / pendulum

Python datetimes made easy
https://pendulum.eustace.io
MIT License
6.12k stars 372 forks source link

If you have the /etc/timezone file set to a timezone string, pendulum.UTC has that timezone's utcoffset instead of None #814

Open gibsondan opened 3 months ago

gibsondan commented 3 months ago

Issue

This appears to be a bug in ZoneInfo that moved into pendulum in the 3.0 release now that TimeZone subclasses ZoneInfo.

Simple repro:

In a Docker container:

FROM python:3.10-slim

RUN pip install pendulum

RUN echo "Asia/Shanghai" > /etc/timezone

Then in Python:

import pendulum, datetime
pendulum.UTC.utcoffset(datetime.datetime(2024, 3, 12, 0, 0, 0, 0)))

outputs datetime.timedelta(seconds=28800) (the utcoffset of the timezone in /etc/timezone) instead of the expected None return value for UTC.

This breaks all kinds of things.

The same issue happens with a ZoneInfo object:

datetime.timedelta(seconds=28800)

See https://stackoverflow.com/questions/74467999/why-does-zoneinfoutc-do-different-time-conversions-from-timezone-utc for a similar report on ZoneInfo.

gibsondan commented 3 months ago

Filed this in cpython too since it seems the bug here is really in ZoneInfo not pendulum: https://github.com/python/cpython/issues/116676