5

So I have -

timezone = pytz.timezone('Asia/Kolkata')
one_time_stamp = '2017-06-01 05:30:00'

zoned_time_stamp = datetime.datetime.strptime(one_time_stamp, '%Y-%m-%d %H:%M:%S')

#This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)

#notice timezone added
non_iso_zoned_ts = zoned_time_stamp.replace(microsecond=0, tzinfo=timezone)
# This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)

iso_date = non_iso_zoned_ts.isoformat()
#This outputs 2017-06-01T05:30:00+05:53 which is incorrect. Ideally it should be 2017-06-01T05:30:00+05:30
print(iso_date)

Now I wonder why isoformat is adding an offset of 05:53 where as timezone Asia/Kolkata is +05:30. ref - https://www.zeitverschiebung.net/en/timezone/asia--kolkata

2

1 Answer 1

5

It's almost always wrong to just tack on a pytz instance for the tzinfo when creating a datetime. The correct way to convert a naive datetime into a timezone aware instance using pytz is with the zone's localize method:

zone.localize(dt)

Output for your case:

>>> print(timezone.localize(zoned_time_stamp))
2017-06-01 05:30:00+05:30

It's quite clearly documented that passing a pytz instance in tzinfo is not a supported way of creating a localized datetime. However, that's also such a commonly seen mistake in Python code - guess many users don't read the docs!

To understand why the incorrect approach showed what it did (weird +05:53 offset), refer to pytz: The Fastest Footgun in the West by Paul Ganssle.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.