pytz - 将UTC和时区转换为当地时间

时间:2014-08-12 12:52:42

标签: python timezone utc pytz

我在utc时区有一个datetime,例如:

utc_time = datetime.datetime.utcnow()

和一个pytz时区对象:

tz = timezone('America/St_Johns')

utc_time转换为给定时区的正确方法是什么?

6 个答案:

答案 0 :(得分:42)

我想我明白了:

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)

此行首先将天真(不知道时区)utc_time datetime对象转换为包含时区(UTC)的datetime对象。然后它使用astimezone函数根据请求的时区调整时间。

答案 1 :(得分:6)

我可以建议使用arrow吗?如果我理解了这个问题:

>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>    
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>

您也可以使用

tz.fromutc(utc_time)

答案 2 :(得分:5)

我同意Tzach的回答。只是想包括不需要is_dst参数:

tz.localize(datetime.utcnow())

该代码将当前UTC时间转换为时区感知当前日期时间。

以下代码将当前UTC时间转换为时区感知日期时间,但不一定是当前时间。时区仅附加到UTC时间值。

getActivity()

答案 3 :(得分:3)

这是fromutc功能的确切目的:

tz.fromutc(utc_time)

as_timezone函数调用fromutc,但首先尝试转换为UTC,这在您的情况下是不需要的)

答案 4 :(得分:1)

另一种非常简单的方法:

由于utcnow方法会返回天真对象,因此您必须将天真对象转换为识别对象。使用replace方法,您可以将天真对象转换为识别对象。然后,您可以使用astimezone方法在不同的时区创建新的日期时间对象。

from datetime import datetime
import pytz    
utc_time = datetime.utcnow()
tz = pytz.timezone('America/St_Johns')

utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method      
st_john_time=utc_time.astimezone(tz)        #astimezone method
print(st_john_time)

答案 5 :(得分:0)

您也可以使用下面的示例,我将其用于类似的任务

if let rightBarButton = self.navigationItem.rightBarButtonItem {
        if let buttonView = rightBarButton.valueForKey("view") {
            let frame = self.navigationController?.view.convertRect(buttonView.frame, toView: self.view)
            print("frame \(frame)") //(330.5, 6.0, 40.0, 30.0)
        }
}

它运行速度很快,您不需要导入其他库。