Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unexpected results converting timezones in python

Tags:

python

pytz

I'm trying to understand why I'm getting these results when converting timezones to UTC:

In [74]: d1 = datetime(2007, 12, 5, 6, 30,tzinfo=pytz.timezone('US/Pacific')) In [75]: d1 Out[75]: datetime.datetime(2007, 12, 5, 6, 30, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, **16:07:00 STD**>) In [76]: d1.astimezone(pytz.utc) Out[76]: datetime.datetime(2007, 12, 5, 14, 23, tzinfo=<UTC>) 

Why did 6:30am become 2:23pm?

On the other hand, if I use the following approach, I get the expected result:

In [90]: d2 = datetime(2007, 12, 5, 6, 30) In [91]: uspac = pytz.timezone('US/Pacific') In [92]: d2_aware = uspac.localize(d2) In [94]: d2_aware.astimezone(pytz.utc) Out[94]: datetime.datetime(2007, 12, 5, 14, 30, tzinfo=<UTC>) 
like image 947
jxstanford Avatar asked Jul 21 '14 01:07

jxstanford


People also ask

How do I convert between time zones in Python?

Use the datetime. astimezone() method to convert the datetime from one timezone to another. This method uses an instance of the datetime object and returns a new datetime of a given timezone.

Is Python datetime timezone aware?

Timezone-aware objects are Python DateTime or time objects that include timezone information. An aware object represents a specific moment in time that is not open to interpretation.

How do I remove timezone in Python?

To remove timestamp, tzinfo has to be set None when calling replace() function. First, create a DateTime object with current time using datetime. now(). The DateTime object was then modified to contain the timezone information as well using the timezone.


1 Answers

What I got is just a workaround, the simple rule is Never create datetime with timezone info by using datetime().

This sample would give you a hint for this. As you see, you could avoid the unexpected difference, once and only you make "naive" datetime (it is, datetime without timezone info) and then localize it (it is not applied when you create datetime on UTC though) :

import pytz from datetime import datetime  # make Jan 1 on PDT -> UTC pdt = pytz.timezone("America/Los_Angeles") pdtnow1 = datetime(2014,1,1, tzinfo=pdt) pdtnow2 = pdt.localize(datetime(2014,1,1)) pytz.utc.normalize(pdtnow1) # > datetime.datetime(2014, 1, 1, 7, 53, tzinfo=<UTC>) pytz.utc.normalize(pdtnow2) # > datetime.datetime(2014, 1, 1, 8, 0, tzinfo=<UTC>)  # make Jan 1 on UTC -> PDT utcnow1 = datetime(2014,1,1, tzinfo=pytz.utc) utcnow2 = pytz.utc.localize(datetime(2014,1,1)) pdt.normalize(utcnow1) # > datetime.datetime(2013, 12, 31, 16, 0,  # > tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>) pdt.normalize(utcnow2) # > datetime.datetime(2013, 12, 31, 16, 0,  # > tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>) 
like image 183
Kenial Avatar answered Sep 19 '22 13:09

Kenial