将UTC日期时间与时区转换为本地

时间:2015-10-01 22:19:39

标签: python python-2.7 datetime

我有一个日期为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加到我当地时间的时间。

提前致谢

编辑:问题是不同的,因为它包含给定字符串中的时间差异,并且点是添加或消除有时需要更改日期的时间差异,如提供的示例中所示。

2 个答案:

答案 0 :(得分:3)

这是一个stdlib解决方案:

pytz

输入时间格式为this question rfc 5322 time format。如果在给定平台上没有使用历史时区数据库,#!/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)) 可能会在过去/未来日期失败。可移植的解决方案是使用Timer timer; private void startTimer() { timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { new AsyncDataClass2 adc = new AsyncDataClass2("u","p"); adc.execute(); } }, 0, 1000); } 模块来访问tz数据库:

onCreate()

答案 1 :(得分:0)

我认为以下通过实现几个具体的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'))