2016-02-12 96 views
2

服务器发送一个字符串,我striptime并保存在这里被称为time_from_frontend变量,然后添加一个tzinfo是这样的:Python。如何创建与datetime.today本地日期时间()

import pytz 

    my_timezone = pytz.timezone("America/Guayaquil") 

    A = time_from_frontend.replace(tzinfo=my_timezone) 
    print A 
    print A.tzinfo 

    B = (datetime.datetime.today()).replace(tzinfo=my_timezone) 
    print B 
    print B.tzinfo 

    print B - A ?¿ 

为什么我得到一个A和B之间的巨大差异?以下是终端打印:

2016-02-11 20:00:00-05:19 
America/Guayaquil 
2016-02-12 01:08:35.478507-05:19 
America/Guayaquil 
5:08:35.478507 

的前端是给我的实际时间,当我做datetime.today(),然后指定的时区,我以为我会得到的时间,而B时间之间的微小差异(即微秒),但我得到5个小时。这是时区差异(“America/Guayaquil”是格林威治标准时间-5)。

我有点理解错误。但我该如何解决它?有没有办法创建一个对应于当地时间的datetime.today()对象?

+1

你似乎在寻找[pytz - Python的世界时区定义](http://stackoverflow.com/questions/4530069/python-how-to-get-a-value-of-datetime-today-that-time-aware) –

+1

检查了这一点,http://tommikaikkonen.github.io/timezones,也许这会帮助你 – PetarP

+1

相关:[使用pytz进行日期时间转换](http://stackoverflow.com/q/27531718/4279) – jfs

回答

3

我猜你前端的datetime是UTC。做替换实际上不会转换日期时间。它使用数据/小时/等。并只使用一个新的时区。

当您拨打datetime.today()时,您将创建一个幼稚 datetime不带任何时区信息。当你做一个replace时,它实际上并没有进行转换,它只是假设你给它的日期已经在你提供的时区,就像你在服务器上做的替换一样。您需要使用astimezone。如果服务器的日期时间也是幼稚并且没有指定时区,则astimezone将会报错。解决这个问题。首先添加一个时区UTC

time_from_frontend = time_from_frontend.replace(tzinfo=pytz.timezone('UTC')) 
converted_server_time = time_from_frontend.astimezone(my_timezone) 
1

datetime.today()已经返回本地日期时间(结果是几乎相同datetime.now())。都将本地时间作为天真的日期时间对象返回(避免它们,除非您想立即显示它们)。

正确的方式来获得当前的时间在给定的时区是使用datetime.now(tz)

#!/usr/bin/env python 
from datetime import datetime 
import tzlocal # $ pip install tzlocal 

local_time = datetime.now(tzlocal.get_localzone()) 

它的工作原理,甚至在DST转换时的本地时间可能是不明确(使用天真datetime.today()可能无法在本案件)。

tzlocal返回一个pytz tzinfo对象,因此它处理的时区可能在过去有不同的UTC偏移量(在这种情况下非pytz代码可能会失败)。


在有你的代码有几个问题:

参见: