Datum vergleichen in Python

Gast #4534619
Lesenswert?

Hi,

ich habe ein festes Datum, jetzt möchte ich vergleichen ob das feste 
Datum in Vergangenheit ist oder in Zukunft.
1
date = "01.04.2016"
2

3

4
for j in date:
5
     if j <= time.strftime("%d.%m.%Y"):
6
            print ("j")
7
     if j >= time.strftime("%d.%m.%Y"):
8
            print ("n")

Das gibt mir das hier aus

j
n
j
j
n
j
n
j
n
n


Wie wäre das richtig?
#4534758
Lesenswert?

Thomas schrieb:
> Hi,
>
> ich habe ein festes Datum, jetzt möchte ich vergleichen ob das feste
> Datum in Vergangenheit ist oder in Zukunft.
> date = "01.04.2016"

Na wenn das Datum fest ist, ist das doch ganz einfach: Der 01.04.2016 
ist in der Vergangenheit und wird es auch immer bleiben. Also ist eine 
Prüfung gar nicht notwendig. Oder was genau meinst du mit "festes 
Datum"?

> Das gibt mir das hier aus

Du prüfst jedes Zeichen deines Strings einzeln gegen den kompletten 
String mit dem aktuellen Datum. Generell kannst du mit einem 
Stringvergleich das Datum nicht vergleichen - zumindest nicht in diesem 
Format.

> Wie wäre das richtig?

So wie Thomas geschrieben hat.

Kaj schrieb:
> date ist bei dir ein String, und du gehst zeichen für zeichen durch.
> Du willst aber eine Liste haben, und Element für Element durch
> gehen.
>
> date = ["01.04.2016"]

Warum sollte er eine Liste aus einem Datum haben wollen?

Kaj schrieb:
> Das glaube ich nicht, Tim! schrieb:
>> Er will mit Sicherheit keine Liste haben ...
> Ich denke schon, sonst macht seine for-Schleife naemlich keinen Sinn.

Was aber genauso gut bedeuten kann, dass er eigentlich keine 
for-Schleife will.
Gast #4534759
Lesenswert?

date = "01.04.2016"


for j in date:
     if j <= time.strftime("%d.%m.%Y"):
            print ("j")
     if j >= time.strftime("%d.%m.%Y"):
            print ("n")

Falls das Datum der 01.04.2016 ist werden doch beide if-Schleifen 
erfüllt oder?

Da  "if j kleiner gleich..."
und "if j größer gleich..."
#8059417
Lesenswert?

Da ich als ersten Treffer hier gelandet bin... die Antwort von Lukas K. (carrotindustries) vom 05.04.2016 23:18 ist die sicherste Lösung. Hier die Erklärung für das Verhalten des codes aus der Ursprungsfrage: mit for j in date : wird erreicht, dass j mit jedem Durchlauf der Schleife ein Zeichen aus date ( von links nach rechts ) enthält.

  1. Durchlauf j = "0" : "0" ist lexikalisch < "01" ( 01.04.2016 )
  2. Durchlauf j = "1" : "1" ist lexikalisch > "01" ...

Man kann das mir einem String-Vergleich machen, muss aber dabei beachten, dass der Vergleich lexialisch also (intern Zeichen für Zeichen) von links nach rechts läuft. Das heißt, das 1. Zeichen ( links ) hat das höchste „Gewicht“

Gewünscht ist sicher, dass das Jahr das größte Gewicht hat ( also nach links damit ) Will man nach Datum sortieren geht das, wenn die Daten im Format Jahr Monat Tag ( z.B: %Y.%m.%d ) vorliegen. ( Die Trennzeichen sind optional und frei wählbar - Hauptsache einheitlich )

Moderator Persönliche Seite #8059448
Lesenswert?

Marek N. schrieb:

Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet (sofern es sich nicht in der Bronzezeit befindet) und dann verglichen.

Das ist 'ne Threadleiche, und sie wurde nur ausgegraben um zu bestätigen, dass bereits die allererste Antwort im Thread die beste war. Da muss man jetzt nicht 10 Jahre danach (ohne neue Erkenntnisse) nochmal alles von vorn aufrühren und diskutieren, was sonst noch möglich wäre.

#8059506
Lesenswert?

Marek N. schrieb:

Naja, das Julianische Datum hat den Vorteil, dass es eben nicht alle 4,29 Milliarden Sekunden überläuft,

Wir sind inzwischen im 64-bit-Zeitalter angekommen ...

Marek N. schrieb:

sondern linear seit dem Jahr 4712 v. Chr. kontinuierlich weitergezählt wird, ohne irgendwelche Modulo-Operationen.

Unix-Zeit wird genauso linear weitergezählt, und bei Verwendung von vorzeichenbehafteter Arithmetik auch beliebig weit in die Steinzeit. Daß man keine komplizierten Rechnungen braucht, ist ja gerade der Sinn der Sekundenzählung.

#8059541
Lesenswert?

Jörg W. schrieb:

Wenn ihr wirklich denkt, dass Lukas' Vorschlag (erste Antwort überhaupt!) für die Frage ungeeignet ist,

Ist er natürlich nicht; im Gegenteil, das Umwandeln in ein Date-Objekt sollte wohl in sämtlichen "modernen" objekt-orientierten Sprachen bzw. unter Nutzung von deren Standardbibliotheken das einfache und zuverlässige Mittel der Wahl sein. Ganz im Gegensatz zu ...

Marek N. schrieb:

Ich hätte es jetzt ganz naiv ins Julianische Datum umgerechnet

... was m.E.n. völliger Unfug ist.

(Firma: Privat) #8059569
Lesenswert?

Selbst, wenn man keine Datums-Funktionen zur Verfügung hat : Das Datum einfach nach YYYYMMDD in eine Zahl umwandeln. Manche sagen auch Datenbankformat dazu.

Also hier : 20160401 - für 01.04.2016 20260609 - für heute

und dann halt mit > oder < abfragen. Eignet sich auch gut, wenn man mehrere Datums sortieren will. Danach halt wieder zurückwandeln. In Python hat man ja auch einiges : [code] from datetime import datetime, timezone api_format = datetime.now(timezone.utc).isoformat()

Ausgabe: "2026-06-09T17:59:00.000+00:00"

[/Code] Da kann man sich notfalls ja auch die ersten 10 Zeichen rausschneiden und die Bindestriche entfernen.

: Bearbeitet durch User

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren