2016-02-12 62 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代碼可能會失敗)。


在有你的代碼有幾個問題:

參見:

相關問題