jmague
jmague

Reputation: 582

timezone conversion in Python

I'm probably missing something about timezones:

>>> import datetime, pytz
>>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date.astimezone(pytz.UTC)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)

I was expecting

datetime.datetime(2013, 9, 3, 15, 00, tzinfo=<UTC>)

Can anyone explain me where these 51 minutes come from?

Thanks,

Jean-Philippe

Upvotes: 10

Views: 18297

Answers (3)

jfs
jfs

Reputation: 414079

Read the note at the very begining of pytz documentation ; use .localize() method to create timezone-aware datetime object:

import datetime
import pytz

naive_dt = datetime.datetime(2013,9,3,16,0)
dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)

to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
print(to_s(dt))
print(to_s(dt.astimezone(pytz.utc)))

Output

2013-09-03 16:00:00 CEST+0200
2013-09-03 14:00:00 UTC+0000

I don't know why you are expecting 15:00 UTC here.

Upvotes: 8

jmague
jmague

Reputation: 582

Thanks Simeon for your answer. It made me realize how shallow is my understanding of all of this. The following experimentations lost me a little more...

>>> import datetime, pytz
>>> date_paris = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date_utc = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.utc)
>>> date_paris.astimezone(pytz.utc)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
>>> date_utc.astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 18, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)

Why this 9 minutes offset shows up when converting in one direction but not the other? The following piece of code concentrate all disappointment:

>>> date_paris
datetime.datetime(2013, 9, 3, 16, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>)
>>> date_paris.astimezone(pytz.utc).astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 17, 51, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>) 

Upvotes: 5

Simeon Visser
Simeon Visser

Reputation: 122326

The UTC offset gives (date.tzinfo.utcoffset(date)):

datetime.timedelta(0, 540)

This is 540 seconds or 9 minutes.

In France the switch to UTC was made on March 11, 1911 and the clocks were turned back 9 minutes and 21 seconds (source 1, source 2):

Until 1911, Paris was 9 minutes and 21 seconds off UTC.

You can also see it here (Paris time in 1911) where the time goes from March 11, 12:01:00 AM to March 10, 11:51:39 PM.

Upvotes: 13

Related Questions