konwersja pytz utc
Jaki jest właściwy sposób konwersji czasu naiwnego i tzinfo
na czas UTC?
Powiedzmy, że mam:
d = datetime(2009, 8, 31, 22, 30, 30)
tz = timezone('US/Pacific')
Pierwsza droga, pytz zainspirowany:
d_tz = tz.normalize(tz.localize(d))
utc = pytz.timezone('UTC')
d_utc = d_tz.astimezone(utc)
Second way, from UTCDateTimeField
def utc_from_localtime(dt, tz):
dt = dt.replace(tzinfo=tz)
_dt = tz.normalize(dt)
if dt.tzinfo != _dt.tzinfo:
# Houston, we have a problem...
# find out which one has a dst offset
if _dt.tzinfo.dst(_dt):
_dt -= _dt.tzinfo.dst(_dt)
else:
_dt += dt.tzinfo.dst(dt)
return _dt.astimezone(pytz.utc)
Nie trzeba dodawać, że te dwie metody dają różne wyniki przez kilka stref czasowych.
Pytanie brzmi - jaka jest właściwa droga?
28
4 answers
Twoja pierwsza metoda wydaje się być zatwierdzona i powinna być świadoma DST.
Można go skrócić trochę, ponieważ pytz.utc = pytz.timezone ('UTC') , ale już o tym wiedziałeś:)
tz = timezone('US/Pacific')
def toUTC(d):
return tz.normalize(tz.localize(d)).astimezone(pytz.utc)
print "Test: ", datetime.datetime.utcnow(), " = ", toUTC(datetime.datetime.now())
20
Author: ewall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-20 18:05:49
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-20 18:05:49
Jaki jest właściwy sposób na konwersję czasu naiwnego i tzinfo na czas utc?
Ta odpowiedź wymienia niektóre problemy z konwersją czasu lokalnego NA UTC :
from datetime import datetime
import pytz # $ pip install pytz
d = datetime(2009, 8, 31, 22, 30, 30)
tz = pytz.timezone('US/Pacific')
# a) raise exception for non-existent or ambiguous times
aware_d = tz.localize(d, is_dst=None)
## b) assume standard time, adjust non-existent times
#aware_d = tz.normalize(tz.localize(d, is_dst=False))
## c) assume DST is in effect, adjust non-existent times
#aware_d = tz.normalize(tz.localize(naive_d, is_dst=True))
# convert to UTC
utc_d = aware_d.astimezone(pytz.utc)
4
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:51
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:51
Użyj pierwszej metody. Nie ma powodu, aby na nowo odkrywać koło konwersji strefy czasowej
0
Author: Jon W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 15:18:22
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-31 15:18:22
import pytz
from django.utils import timezone
tz = pytz.timezone('America/Los_Angeles')
time = tz.normalize(timezone.now())
-2
Author: Antony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 21:25:59
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 21:25:59