[英]Convert UTC datetime with timezone to local
我在UTC和tzinfo中有一個帶日期的字符串
"Thu, 01 Oct 2015 00:02:01 +0200"
如何將其轉換為本地時間,以便輸出
"2015-10-02 02:02:01"
我試過了
parser.parse("Thu, 01 Oct 2015 00:02:01 +0200")
但是我找不到一種方法可以將此tzinfo與時間相加以獲得本地時間。
提前致謝
編輯:問題是不同的,因為它在給定的字符串中包括時差,而重點是添加或減少有時需要更改日期的時差,如提供的示例中所示。
這是一個stdlib解決方案:
#!/usr/bin/env python
from datetime import datetime
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz("Thu, 01 Oct 2015 00:02:01 +0200"))
print(datetime.fromtimestamp(timestamp)) # get local time
輸入的時間格式是email
模塊可以理解的 rfc 5322時間格式 。 datetime.fromtimestamp()
在給定平台上未使用歷史時區數據庫,則可能無法使用過去/將來的日期。 一個可移植的解決方案是使用pytz
模塊,以訪問tz數據庫:
#!/usr/bin/env python
from datetime import datetime
from email.utils import parsedate_tz, mktime_tz
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone() # return pytz tzinfo
timestamp = mktime_tz(parsedate_tz("Thu, 01 Oct 2015 00:02:01 +0200"))
print(datetime.fromtimestamp(timestamp, local_timezone))
我認為以下通過實現幾個具體的tzinfo
類tzinfo
您的要求:
from datetime import datetime, timedelta, tzinfo
import time as _time
_ZERO = timedelta(0)
_STDOFFSET = timedelta(seconds=-_time.timezone)
if _time.daylight:
_DSTOFFSET = timedelta(seconds=-_time.altzone)
else:
_DSTOFFSET = _STDOFFSET
_DSTDIFF = _DSTOFFSET - _STDOFFSET
class UTC(tzinfo):
""" Concrete tzinfo time zone class for UTC
"""
def utcoffset(self, dt):
return _ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return _ZERO
UTC = UTC()
class LocalTimezone(tzinfo):
""" Concrete tzinfo time zone class for current timezone
"""
def utcoffset(self, dt):
if self._isdst(dt):
return _DSTOFFSET
else:
return _STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return _DSTDIFF
else:
return _ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
# everything depends on this private method which assumes 'dt' argument
# is in local time
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, -1) # last -1 means dst unknown (mktime will fill in)
stamp = _time.mktime(tt) # mktime returns secs
tt = _time.localtime(stamp) # localtime returns time_struct with tm_isdst attribute
return tt.tm_isdst > 0
LOCAL = LocalTimezone()
stamp = 'Thu, 01 Oct 2015 00:02:01 +0200'
dt = datetime(*_time.strptime(' '.join(stamp.split()[:-1]),
'%a, %d %b %Y %H:%M:%S')[:6], tzinfo=UTC)
local_dt = dt.astimezone(LOCAL)
print(local_dt.strftime('%Y-%M-%d %H:%M:%S'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.