2017-01-26 4 views
3

Hier ist mein Code:Pythons Datetime-Konvertierung

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = datetime.strptime(time_str, '%d %b at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

Was ich habe Probleme mit einem time_str verwendet, die nur die Zeit ist, und beinhalten nicht den Tag/Monat. dh: "02.00"

Wenn ich es ändern: time_dt = datetime.strptime (time_str, '% H:% M') dann bekomme ich eine Fehlermeldung über strftime und Jahre vor 1900.

So Ich bin hier ratlos. Was muss getan werden, um nur eine Zeit in der Eingabezeichenfolge zuzulassen?

Antwort

2

Sie können mit dateutil Paket versuchen. Die Methode parser.parse() ist gut, wenn sich die Eingabezeichenfolge ändert. Es wird ein Datetime-Objekt mit dem heutigen Datum erstellt, wenn in der Zeichenfolge nur die Zeit angegeben ist. Es wird mit verschiedenen anderen Formaten umgehen.

from datetime import datetime 
from dateutil import parser 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = parser.parse(time_str) 
    return (time_dt + offset).strftime('%I:%M %p') 

Wenn Sie nur Datetime-Paket beschränkt sind, können Sie etwas tun:

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    if len(time_str) <= 5: 
     time_str = datetime.now().strftime('%d %B at ') + time_str 
    offset = datetime.now() - datetime.utcnow() 
    time_dt = datetime.strptime(time_str, '%d %B at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

print get_local_time('27 March at 3:00') 
print get_local_time('3:00') 

Oder man kann es wie so tun:

from datetime import datetime 

def get_local_time(time_str): 
    """ 
    takes a string in the format of '27 March at 3:00' which is UTC 
    and converts it to local time and AM/PM 
    :param time_str: 
    """ 
    offset = datetime.now() - datetime.utcnow() 
    if len(time_str) <= 5: 
     time_dt = datetime.combine(datetime.now().date(), datetime.strptime(time_str, '%H:%M').time()) 
    else: 
     time_dt = datetime.strptime(time_str, '%d %B at %H:%M') 
    return (time_dt + offset).strftime('%I:%M %p') 

print get_local_time('27 March at 3:00') 
print get_local_time('3:00') 
+0

Ich schätze, das würde gut funktionieren. Aber ich benutze dies in Verbindung mit einer anderen App (Kodi), und da dateutil anscheinend keine darin enthaltene Bibliothek ist, funktioniert es nicht. Kenne es immer noch als Antwort, es sei denn, jemand hat etwas anderes. – Bahnzo

+1

@Bahnzo \t Ich werde es verbessern, wenn Sie dateutil Paket nicht wollen. Gib mir etwas Zeit. – MYGz

+0

@Bahnzo \t Ich hoffe, es wird jetzt für Sie arbeiten. – MYGz

2

Ich habe es gerade in der Repl versucht. Er arbeitete für mich:

>>> from datetime import datetime 
>>> time = "02:00" 
>>> time_dt = datetime.strptime(time, '%H:%M') 
>>> time_dt 
datetime.datetime(1900, 1, 1, 2, 0) 
>>> 

Wenn ich mich recht erinnere, kann ein Datetime speichern nie nur Zeit, es wird immer ein Dummy-Datum 1. Januar sein, 1900. Wenn Sie die Zeit ohne die gespeichert werden sollen Dummy-Datum, versuchen Sie es mit der time Klasse. Es hat auch eine strftime Funktion, siehe die Dokumentation hier: https://docs.python.org/2/library/time.html

Sie könnten auch versuchen, ein anderes Dummy-Datum zu Ihrer Datetime hinzufügen, wenn es nicht funktioniert.

+0

Ich bekomme definitiv einen Fehler. Dies wird mit einer Anwendung namens "Kodi" verwendet, die Python 2.7 verwendet. also bin ich mir nicht sicher, wie das stört. Aber du hast auch recht, ich kann einen Dummy Tag und Monat hinzufügen und es funktioniert gut. Scheint nur, ich sollte nicht müssen. – Bahnzo