Python - Anzahl Tage (int) in MM DD YYYY umwandeln

Forum für alles rund ums Coden und web.design - HTML, XHTML, XML, CSS, PHP, ASP, Zugriffsrechten, Mods uvm.
Antworten
Bradamante
Anarki
Anarki
Beiträge: 1557
Registriert: Jul 2004

Python - Anzahl Tage (int) in MM DD YYYY umwandeln

Beitrag von Bradamante »

Ich arbeite ja schon länger an meinem Python-Game ...

1.
Bin jetzt auf ein Problem gestoßen, was vielleicht keins ist. Da ich nirgendwo eine Antwort finde, stelle ich sicher die Frage falsch.

Bisher jedenfalls speichere ich die Anzahl der vergangenen Tage in meinen Save Games. Detaillierter brauch ich's nicht. Die teile ich bisher nur durch 365, z.B. ist dann
1017685 = year 2788, day 65

Wie wandele ich nun die Tage in Monat + Tag um? Mir ist klar, dass ich auch mit YYYY:MM :D D arbeiten könnte, und Python dafür reichlich mitbringt. Aber so mancher code basiert bereits darauf, also gibt es vielleicht doch eine Möglichkeit? Muss doch irgendwer schonmal was geschrieben haben?

2.
Es gab doch eine bestimmte Technik um so häufig anzutreffene Checks zu vermeiden, ob eine bestimmte Aktion den Spieler betrifft, also die vom Spieler kontrollierte Figur unter anderen gleichartigen Objekten, z.B.

Code: Alles auswählen

def destroy():
# destroy something
if self.ID == 0:
    displayInfo()
Weiß jemand, was ich meine?
spid
Doom
Doom
Beiträge: 3580
Registriert: Apr 2001
Kontaktdaten:

Beitrag von spid »

nach welchem kalender denn? einfach durch 365 zu teilen reicht beim gregorianischen kalender nicht. immerhin kennt der schaltjahre und so, die bei deiner bisherigen rechnung völlig ignoriert werden.
für deinen fall, könntest du also einfach die anzahl der tage durch die anzahl der monate in deinem kalender teilen, bspw. 12, und fertig.

oder aber, du denkst dir einen komplett eigenen kalender aus, der zu deiner restlichen spielewelt konsistent ist. das kann spielen noch einen gewissen charme geben.
Bradamante
Anarki
Anarki
Beiträge: 1557
Registriert: Jul 2004

Beitrag von Bradamante »

Naja, darum mein ich ja, ob's dafür nicht ein Modul oder 3rd Party Library gibt. Weil wie du sagst, wenn man's selber macht, wird's unterkomplex:

Code: Alles auswählen

def getDates(dateint):
	year = dateint / 365
	daysinyear = dateint % 365
	monthday = daysinyear % 12
	months = ["January", "February", "March", "April", "May", "June", "July",
	"August", "September", "October", "November", "December"]
	monthname = months[daysinyear / 12]
	if monthday == 1:
		monthday = "1st"
	elif monthday == 2:
		monthday = "2nd"
	elif monthday == 3:
		monthday = "3rd"
	else:
		monthday = str(monthday)+"th"
	return (monthname, monthday, year)

# e.g.  getDates(1017624)
Würde am Ende vermutlich keiner merken ...
Flp
Slash
Slash
Beiträge: 631
Registriert: Sep 2000
Wohnort: Backnang(BW)
Kontaktdaten:

Beitrag von Flp »

Bradamante hat geschrieben:
2.
Es gab doch eine bestimmte Technik um so häufig anzutreffene Checks zu vermeiden, ob eine bestimmte Aktion den Spieler betrifft, also die vom Spieler kontrollierte Figur unter anderen gleichartigen Objekten, z.B.

Code: Alles auswählen

def destroy():
# destroy something
if self.ID == 0:
    displayInfo()
Weiß jemand, was ich meine?
Polymorphie?




//edit zu schaltjahrs problematik,
Regel: Wenn die Jahreszahl ohne Rest durch 4 teilbar ist, handelt es sich um ein Schaltjahr.
Ausnahme: Wenn die Jahreszahl auch durch 100 ohne Rest teilbar ist, dann handelt es sich doch nicht um ein Schaltjahr:
Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 ohne Rest teilbar ist, dann handelt es sich doch um ein Schaltjahr.
stehzwerg
Cadavre
Cadavre
Beiträge: 3370
Registriert: Nov 2004

Beitrag von stehzwerg »

kannste das nicht mit dem unix timestamp machen?
Bild
Flp
Slash
Slash
Beiträge: 631
Registriert: Sep 2000
Wohnort: Backnang(BW)
Kontaktdaten:

Beitrag von Flp »

Code: Alles auswählen

def getDates(dateint):
    avg_days_per_year = 365.2425
    month_name_dict = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", 7:"July",
    8:"August", 9:"September", 10:"October", 11:"November", 12:"December"}
    
    def append_suffix(number):
        if number > 3:
            return "%dth" % number
        else:
            return {1:'1st', 2:'2nd', 3:'3rd'}[number]
        
    def is_leapyear(year):
        return ((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0)
    
    year = int(dateint / avg_days_per_year)

    days_per_month_dict = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
    if is_leapyear(year): days_per_month_dict[2] = 29
    day_of_month = int(dateint % avg_days_per_year)
    month_name = ""
    for current_month in range(1, 13):
        if (day_of_month - days_per_month_dict[current_month] > 0):
            day_of_month -= days_per_month_dict[current_month]
        else:
            month_name = month_name_dict[current_month]
            break
    
    return (month_name, append_suffix(day_of_month), year)

print getDates(734575)
ich hoffe das ergebnis ist korrekt (weiß nicht wie ichs nachprüfen kann)
jedenfalls sollte man die Schaltjahrsungenauigkeit schon einbeziehen, da die Fehlerrate ja immer höher wird.
Von Jahr 0 bis heute gezählt sind das ~500 Tage die man daneben liegt.
Das ist über 1 Jahr.


Code: Alles auswählen

from datetime import date
date.fromordinal(734575) # zählt ab 1.Jan.0001
wobei deren lösung nochmal ne ecke perverser ist
http://svn.python.org/view/python/trunk ... iew=markup [ab Zeile 244)
Antworten