Countdown für Ereignisse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Highlander062
User
Beiträge: 10
Registriert: Mittwoch 7. Juli 2021, 11:55

Hallo Python Forum

Ich würde gerne wissen wie mein (Ereignis Countdown) nach Ablauf des Ereignistages (fixer Tag) wieder von neuem den Countdown beginnt.
Beispiel: fixer Tag ist 16.11. im Jahr.
Sobald der 16.11. um einen Tag überschritten ist bleibt der Text "Das Ereignis ist nun vorbei bye, bye, bis zum n\xc3\xa4chsten Ereignis"
und wechselt erst bei Jahresbeginn im nächsten Jahr auf den richtigen Countdown Ablauf (wieviel Tage noch verbleiben bis zum 16.11.).

Wenn ich jetzt aber eine ( + 1,) einfüge (ereignis = datetime(now.year + 1, 11, 16))
dann funktioniert der Countdown Ablauf wieder richtig, aber leider nur bis zum Jahreswechsel dann zählt er durch die eingefügte ( + 1,)
nochmals 365 Tage hinzu.
Also müsste ich jetzt die eingefügte ( + 1,) wieder entfernen damit der Countdown wieder passt.

was kann man nach dieser zeile einfügen, damit der Countdown wieder von neuem beginnt?
elif final < 0:
return "Das Ereignis ist nun vorbei bye, bye, bis zum n\xc3\xa4chsten Ereignis"

Würde mich sehr über eine Lösung meines Problems freuen

Ich bedanke mich jetzt schon Herzlich für eure Hilfe.


PS.: CountdownToEreignis.py benutze ich auf meiner TV-Box






from Converter import Converter
from Components.Element import cached
from datetime import datetime, time

class CountdownToEreignis(Converter, object):
DAYS = 0
TIME = 1

def __init__(self, type):
Converter.__init__(self, type)
if type == "Ereignis":
self.type = self.DAYS
else:
self.type = self.TIME

@cached
def getText(self):
time = self.source.time
if time is None:
return ""
if self.type == self.DAYS:
return self.calculate()
elif self.type == self.TIME:
return self.calculate(False)
else:
return "???"

text = property(getText)

def calculate(self,what=True):
now = datetime.now()
if what:
ereignis = datetime(now.year + 1, 11, 16)
delta = ereignis - now
final = delta.days
if final > 0:
return str(final) + " Tage sind es noch bis zum Ereignis"
elif final == 0:
return "Heute findet das Ereignis statt!"
elif final < 0:
return "Das Ereignis ist nun vorbei bye, bye, bis zum n\xc3\xa4chsten Ereignis"

def dateDiffInSeconds(self,date1, date2):
timedelta = date2 - date1
return timedelta.days * 24 * 3600 + timedelta.seconds

def daysHoursMinutesSecondsFromSeconds(self,seconds):
(minutes, seconds) = divmod(seconds, 60)
(hours, minutes) = divmod(minutes, 60)
(days, hours) = divmod(hours, 24)
return (days, hours, minutes, seconds)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die erste Zeile `from Converter import Converter` läßt befürchten, dass Du pro Modul eine Klasse hast. Das macht man in Python nicht, sondern fasst mehrere zusammenhängende Definitionen in einem Modul zusammen.

Module werden wie Variablennamen, Funktionen und Methoden auch, komplett klein geschrieben.

Du erbst explizit von object, rufst aber das __init__ of object gar nicht auf. Was benutzt Du denn von object?

Die Methode getText sollte es nicht geben, weil man direkt das Property text definieren kann.

In calculate, was soll `what` bedeuten? Es scheint ja direkt mit self.type zusammenhängen, der Parameter ist also überflüssig.
Dann hat calculate nur einen expliziten Rückgabewert bei what == True, das sollte nicht sein.
Strings stückelt man nicht mit + zusammen, sondern benutzt format-Strings.
Das Wort "nächste" hat komische Zeichen mittendrin, da scheint es einen Tippfehler zu geben.

`dateDiffInSeconds` ist keine Methode, weil sie `self` nicht braucht, das gibt es ungefähr auch schon als total_seconds().
Für daysHoursMinutesSecondsFromSeconds braucht self auch nicht.

Du hast also effektiv nur eine Methode, calculate, das ist also gar keine richtige Klasse, sondern sollte als einfache Funktion definiert werden:

Code: Alles auswählen

from datetime import datetime, time

DAYS = 0
TIME = 1

def get_countdown(type):
    if type == DAYS:
        now = datetime.now()
        ereignis = datetime(now.year + 1, 11, 16)
        delta = ereignis - now
        final = delta.days
        if final > 0:
            return f"{final} Tage sind es noch bis zum Ereignis"
        elif final == 0:
            return "Heute findet das Ereignis statt!"
        else:
            return "Das Ereignis ist nun vorbei bye, bye, bis zum nächsten Ereignis"
    elif type == TIME:
        return "Was soll hier passieren?"
    else:
        raise ValueError("unknown type")
Wenn ich Deine Beschreibung richtig verstehe, gibt es den Fall "bye,bye" gar nicht, weil sobald das Ereignis vorbei ist, wieder 365-Tag angezeigt werden sollen.

Zum Problem: Du mußt prüfen, ob Du vor oder nach dem Termin in diesem Jahr bist und im zweiten Fall ins nächste Jahr springen.
Highlander062
User
Beiträge: 10
Registriert: Mittwoch 7. Juli 2021, 11:55

Erstmals danke für die schnelle Rückantwort Sirius3

Zu deiner Antwort oder Frage: (Das Wort "nächste" hat komische Zeichen mittendrin, da scheint es einen Tippfehler zu geben.)
die komischen Zeichen stehen für den Umlaut (ä) weil die box nur so den Umlaut richtig darstellt.
Es ist etwas kompliziert da die SAT-Box das python Prog. (CountdownToEreignis.py) als Converter abfragt und es wird auf dem TV-Bildschirm korrekt angezeigt.
Bis auf die Kleinigkeit das der Countdown erst wieder am 01.01. des neuen Jahres anfängt.
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

Wie Sirius3 schon geschrieben hat:
Sirius3 hat geschrieben: Mittwoch 17. November 2021, 16:00 Zum Problem: Du mußt prüfen, ob Du vor oder nach dem Termin in diesem Jahr bist und im zweiten Fall ins nächste Jahr springen.

Code: Alles auswählen

from datetime import date
from dateutil.relativedelta import relativedelta

today = date.today()
ereignis_date = date(today.year , 11 , 10)

if ereignis_date < today:
    ereignis_date = ereignis_date + relativedelta(years=1)

countdown = ereignis_date - today

print('Noch', countdown.days , 'Tage bis Ereignis')
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Mit einem import weniger, falls man externe Abhängigkeiten vermeiden will:

Code: Alles auswählen

from datetime import date

today = date.today()
ereignis_date = date(today.year , 11 , 10)

if ereignis_date < today:
    ereignis_date = ereignis_date.replace(year=ereignis_date.year + 1)

countdown = ereignis_date - today

print('Noch', countdown.days , 'Tage bis Ereignis')
Sieht jedenfalls hässlicher aus.
Meistens ist aber dateutil schon vorhanden, da auch andere Pakete dateutil nutzen.
Ich meine, das kommt sogar von dem gleichen Entwickler, der auch das datetime-modul programmiert hat.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Highlander062
User
Beiträge: 10
Registriert: Mittwoch 7. Juli 2021, 11:55

Sirius3 hat geschrieben: Mittwoch 17. November 2021, 16:00
Zum Problem: Du mußt prüfen, ob Du vor oder nach dem Termin in diesem Jahr bist und im zweiten Fall ins nächste Jahr springen.

wie kann ich prüfen ob ich vor oder nach dem Termin bin, damit ich im zweiten Fall ins nächste Jahr springen kann?

bitte um Hilfe


from datetime import datetime, time

DAYS = 0

def get_countdown(type):
if type == DAYS:
now = datetime.now()
ereignis = datetime(now.year + 1, 11, 16)
delta = ereignis - now
final = delta.days
if final > 0:
return f"{final} Tage sind es noch bis zum Ereignis"
elif final == 0:
return "Heute findet das Ereignis statt!"
else:
return "Das Ereignis ist nun vorbei bye, bye, bis zum nächsten Ereignis"
else:
raise ValueError("unknown type")


Vielen Dank schon mal für eure Mühe
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Indem Du prüfst. ob ein datetime-Objekt größer oder kleiner einem anderen datetime-Objekt ist.
Das heutige Datum ist z.B. größer als das vom 16.11.
Antworten