2016-06-09 90 views
-2

我有一個來自第三方(我的python程序外部)的字符串時間,我需要比較現在的時間。那個時間多久了?比較時間與時區到現在

我該怎麼做?

我看過datetimetime庫以及pytz,並且找不到明顯的方式來執行此操作。它應該自動包含DST,因爲第三方沒有明確聲明它的偏移量,只有時區(美國/東部)。

我已經試過這一點,它失敗:

dt = datetime.datetime.strptime('June 10, 2016 12:00PM', '%B %d, %Y %I:%M%p') 
dtEt = dt.replace(tzinfo=pytz.timezone('US/Eastern')) 
now = datetime.datetime.now() 

now - dtEt 

類型錯誤:無法抵消減去天真和偏移感知日期時間

+1

請張貼你已經嘗試過的一些例子,以及他們爲什麼沒有工作。 – AidenMontgomery

回答

0

問得好扎克!我自己有這個問題。

下面是一些代碼這樣做:

from datetime import datetime 
import time 
import calendar 
import pytz 

def howLongAgo(thirdPartyString, timeFmt): 
    # seconds since epoch 
    thirdPartySeconds = calendar.timegm(time.strptime(thirdPartyString, timeFmt)) 
    nowSecondsUTC = time.time() 

    # hour difference with DST 
    nowEastern = datetime.now(pytz.timezone('US/Eastern')) 
    nowUTC = datetime.now(pytz.timezone('UTC')) 
    timezoneOffset = (nowEastern.day - nowUTC.day)*24 + (nowEastern.hour - nowUTC.hour) + (nowEastern.minute - nowUTC.minute)/60.0 

    thirdPartySecondsUTC = thirdPartySeconds - (timezoneOffset * 60 * 60) 
    return nowSecondsUTC - thirdPartySecondsUTC 

howLongAgo('June 09, 2016 at 06:22PM', '%B %d, %Y at %I:%M%p') 
# first argument always provided in ET, either EDT or EST 
+0

謝謝,這正是我所尋找的。現在我的恆溫器將保持完美的溫度! –

+0

1-你的答案假設US/Eastern有一個不變的utc偏移量 - 這是不正確的2-如果你知道輸入時間在美國/東部時區,那麼使用'(datetime.now(pytz.utc) - pytz.timezone ('US/Eastern')。localize(datetime.strptime(thirdPartyString,timeFmt),is_dst = None))。total_seconds()'以秒爲單位查找差異。 – jfs

+0

本地化絕對是一個更好的答案,可能不得不爲一個明確定義的小時/年(DST實際發生時)做一些錯誤處理。我的解決方案假設東部和UTC之間的差異與「now」和「thirdParty」時間相同(因此它在六個月前不會運行)。 – skier31415

0

TypeError: can't subtract offset-naive and offset-aware datetimes

要修復TypeError,使用時區意識到datetime對象:

#!/usr/bin/env python 
from datetime import datetime 
import pytz # $ pip install pytz 
tz = pytz.timezone('US/Eastern') 

now = datetime.now(tz) # the current time (it works even during DST transitions) 
then_naive = datetime.strptime('June 10, 2016 12:00PM', '%B %d, %Y %I:%M%p') 
then = tz.localize(then_naive, is_dst=None) 
time_difference_in_seconds = (now - then).total_seconds() 

is_dst=None引起的歧義/不存在的時間異常。您也可以使用is_dst=False(默認)或is_dst=True,請參閱python converting string in localtime to UTC epoch timestamp