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>)
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.
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.
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.
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>)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With