3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個贊
在Python 3.3+中:
from datetime import datetime, timezone
def utc_to_local(utc_dt):
return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)
在Python 2/3中:
import calendar
from datetime import datetime, timedelta
def utc_to_local(utc_dt):
# get integer timestamp to avoid precision lost
timestamp = calendar.timegm(utc_dt.timetuple())
local_dt = datetime.fromtimestamp(timestamp)
assert utc_dt.resolution >= timedelta(microseconds=1)
return local_dt.replace(microsecond=utc_dt.microsecond)
使用pytz(Python 2/3):
import pytz
local_tz = pytz.timezone('Europe/Moscow') # use your local timezone name here
# NOTE: pytz.reference.LocalTimezone() would produce wrong result here
## You could use `tzlocal` module to get local timezone on Unix and Win32
# from tzlocal import get_localzone # $ pip install tzlocal
# # get local timezone
# local_tz = get_localzone()
def utc_to_local(utc_dt):
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
return local_tz.normalize(local_dt) # .normalize might be unnecessary
例
def aslocaltimestr(utc_dt):
return utc_to_local(utc_dt).strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')
print(aslocaltimestr(datetime(2010, 6, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime(2010, 12, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime.utcnow()))
產(chǎn)量
Python 3.3
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.093745 MSK+0400
Python 2
2010-06-06 21:29:07.730000
2010-12-06 20:29:07.730000
2012-11-08 14:19:50.093911
pytz
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.146917 MSK+0400
注意:它考慮了DST和最近MSK時區(qū)的utc偏移的變化。
我不知道非pytz解決方案是否適用于Windows。

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個贊
您不能只使用標(biāo)準(zhǔn)庫,因?yàn)闃?biāo)準(zhǔn)庫沒有任何時區(qū)。你需要pytz或dateutil。
>>> from datetime import datetime>>> now = datetime.utcnow()>>> from dateutil import tz>>> HERE = tz.tzlocal()>>> UTC = tz.gettz('UTC')The Conversion:>>> gmt = now.replace(tzinfo=UTC)>>> gmt.astimezone(HERE)datetime.datetime(2010, 12, 30, 15, 51, 22, 114668, tzinfo=tzlocal())
或者,你可以通過實(shí)現(xiàn)自己的時區(qū)來實(shí)現(xiàn)沒有pytz或dateutil。但這很愚蠢。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個贊
我想我想出來了:計算自紀(jì)元以來的秒數(shù),然后使用time.localtime轉(zhuǎn)換為本地timzeone,然后將時間結(jié)構(gòu)轉(zhuǎn)換回日期時間......
EPOCH_DATETIME = datetime.datetime(1970,1,1)
SECONDS_PER_DAY = 24*60*60
def utc_to_local_datetime( utc_datetime ):
delta = utc_datetime - EPOCH_DATETIME
utc_epoch = SECONDS_PER_DAY * delta.days + delta.seconds
time_struct = time.localtime( utc_epoch )
dt_args = time_struct[:6] + (delta.microseconds,)
return datetime.datetime( *dt_args )
它正確應(yīng)用夏季/冬季夏令時:
>>> utc_to_local_datetime( datetime.datetime(2010, 6, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 6, 6, 19, 29, 7, 730000)
>>> utc_to_local_datetime( datetime.datetime(2010, 12, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 12, 6, 18, 29, 7, 730000)
添加回答
舉報