2017-09-13 1 views
-1

Ich habe diese Funktion, die einen Zeitstempel in ein Datetime-Objekt konvertiert, das entweder sagt; "Heute um 10:56 Uhr" oder "Gestern um 1:06 Uhr" oder andere ...Zeitstempel zu lange Datetime

Ich habe derzeit einige Probleme damit.

otherdate = 1504246379 
now = time.time() 
if otherdate: 
    dt = now - otherdate 
    offset = dt.seconds + (dt.days * 60 * 60 * 24) 
if offset: 
    delta_s = offset % 60 
    offset /= 60 
    delta_m = offset % 60 
    offset /= 60 
    delta_h = offset % 24 
    offset /= 24 
    delta_d = offset 
else: 
    raise ValueError("Must supply otherdate or offset (from now)") 
if delta_d > 1: 
    if delta_d > 6: 
     date = now + timedelta(days=-delta_d, hours=-delta_h, minutes=-delta_m) 
     return date.strftime('%A, %Y %B %m, %H:%I') 
    else: 
     wday = now + timedelta(days=-delta_d) 
     return wday.strftime('%A') 
if delta_d == 1: 
    return "Yesterday" 
if delta_h > 0: 
    return "%dh%dm ago" % (delta_h, delta_m) 
if delta_m > 0: 
    return "%dm%ds ago" % (delta_m, delta_s) 
else: 
    return "%ds ago" % delta_s 

Der aktuelle Fehler I erhalten ist:

Traceback (most recent call last): 
File "test.py", line 69, in <module> 
date = get_long_date(timestamp) 
File "test.py", line 40, in get_long_date 
offset = dt.seconds + (dt.days * 60 * 60 * 24) 
AttributeError: 'float' object has no attribute 'seconds' 

Also ging ich hinzufügen:

dt = timedelta(dt) 

und löscht den Fehler, aber wenn ich die delta_d (Tage Offset) drucken es ist eine negative Zahl ... Kann jemand mir helfen, meine Funktion zu vervollständigen?

Danke,

Denis Angell

+1

Müssen Sie die Funktionalität der Parsing-Datetimes wirklich selbst implementieren oder können Sie eine andere Bibliothek verwenden? Ich rate Ihnen, sich selbst zu implementieren, denn wenn Sie es richtig machen wollen, ist es nicht so trivial. – alphiii

+0

Prob nicht, haben Sie eine Bibliothek, die Sie empfehlen? Eine, die mir eine Ausgabe basierend auf der Offset-Zeit geben würde? –

+0

Welche Einheit ist 'otherdate = 1504246379' in Sekunden? –

Antwort

0

dt = now - otherdate ein float, keine datetime oder timedelta Objekt, dt.day usw. zurückkehren wird aus diesem Grunde scheitern. Das Modul datetime enthält die Klassenmethode datetime.utcfromtimestamp(timestamp), die möglicherweise die gewünschte Konvertierung durchführt Werfen Sie einen Blick auf die Klassenbibliothek in den Python-Dokumenten ...

0

dt in Ihrem Code ist vom Typ float, da Sie zwei Float-Typen subtrahieren.

>>> type(dt) 
<type 'float'> 

Sie müssen möglicherweise dt

dt = timedelta(seconds=dt) 

auch konvertieren, Sie möchten natural Bibliothek zu reduzieren auf Ihren Code versuchen.

pip install natural

prüfen Dokumentation here

Sie können mit einem Liner vorwärts oder rückwärts Delta direkt finden.

from natural import date 
import time 
>>> otherdate = 1504246379 
>>> date.day(time.time() - otherdate) 
'January 13' 
>>> date.day(time.time() + otherdate) 
'May 14' 
>>> 

Ich hoffe, es hilft.

Verwandte Themen