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)
Countdown für Ereignisse
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:
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.
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")
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.
-
- 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.
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.
Wie Sirius3 schon geschrieben hat:
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')
- 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:
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.
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')
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
-
- User
- Beiträge: 10
- Registriert: Mittwoch 7. Juli 2021, 11:55
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