2016-06-09 13 views
-2

Ich habe eine Zeichenfolge Zeit von einer dritten Partei kommen (außerhalb meines Python-Programms), und ich muss diese Zeit jetzt zu vergleichen. Wie lange ist diese Zeit her?Zeit mit Zeitzone zu vergleichen

Wie kann ich das tun?

Ich habe die datetime und time Bibliotheken sowie pytz angeschaut und kann keinen offensichtlichen Weg finden, dies zu tun. Es sollte automatisch DST enthalten, da die dritte Partei nicht explizit ihren Offset angibt, nur die Zeitzone (US/Eastern).

Ich habe das versucht, und es scheitert:

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 

Typeerror: kann nicht abziehen Offset-naiv und Offset-aware Datetimes

+1

Bitte posten Sie einige Beispiele von dem, was Sie versucht haben und warum sie nicht funktionierten. – AidenMontgomery

Antwort

0

Gute Frage Zack! Ich hatte dieses Problem selbst.

Hier einige Code zu tun, so:

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

Danke, genau das habe ich gesucht. Jetzt hält mein Thermostat die perfekte Temperatur aufrecht! –

+0

1- Ihre Antwort geht davon aus, dass US/Eastern einen konstanten UTC-Offset hat - es ist falsch 2- Wenn Sie wissen, dass die Eingabezeit in US/Eastern ist, verwenden Sie '(datetime.now (pytz.utc) - pytz.timezone) ('US/Eastern'). Localize (datetime.strptime (thirdPartyString, timeFmt), is_dst = Keine)). Total_seconds() 'um die Differenz in Sekunden zu finden. – jfs

+0

Localize ist definitiv eine bessere Antwort, muss möglicherweise einige Fehlerbehandlung für die eine Stunde/Jahr, die zweideutig definiert ist (wenn DST tatsächlich auftritt) zu tun haben. Meine Lösung geht davon aus, dass der Unterschied zwischen Eastern und UTC für "now" und "thirdParty" gleich ist (also vor sechs Monaten nicht funktionieren wird). – skier31415

0

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

die TypeError, Verwendung Zeitzone bewusst Datetime-Objekte zu beheben:

#!/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 verursacht eine Ausnahme für mehrdeutige/nicht vorhandene Zeiten . Sie können auch is_dst=False (Standard) oder is_dst=True verwenden, siehe python converting string in localtime to UTC epoch timestamp.