Datumsarithmetik - Wochentag vom Datum

Code-Stücke können hier veröffentlicht werden.
Antworten
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Tach,
habe mal wieder etwas herum gecodet und das ist dabei rausgekommen.

Code: Alles auswählen

# 
# Funktion: dateartihmeatik
# Autor: Christoph Heer
#
# Aufgabe:
#    Berechnet mit der Datumsarithmetik, denn Wochentag vom Datum ausgehen.
#
# Verwendung:
#    datearithmetik('12.09.2008')
#

import math
import re

def datearithmetik(date):
    monthvalues = {1:0,2:3,3:3,4:6,5:1,6:4,7:6,8:2,9:5,10:0,11:3,12:5}
    yearvalues = {17:4,18:2,19:0,20:6,21:4,22:2,23:0}
    dayvalues = {0:'Sunday',1:'Monday',2:'Tuesday',3:'Wednesday',4:'Thursday',5:'Friday',6:'Saturday'}
    filter = re.compile(r'(\d{2}).(\d{2}).(\d{2,})(\d{2,})')
    date = filter.match(date)
    if date != None:
        date = [int(date.group(1)),int(date.group(2)),int(date.group(3)),int(date.group(4))]
    else:
        return 'Only date in format DD.MM.YYYY'
    yearvalue = ((date[3] + (date[3] / 4)) % 7) + yearvalues[date[2]]
    year = date[2] + date[3]
    if year % 400 == 0: 
        changeyear == True 
    elif year % 100 == 0: 
        changeyear = False
    elif year % 4 == 0: 
        changeyear = True
    else: 
        changeyear = False
    if changeyear == True:
        if date[1] == 1:
             yearvalue = yearvalue - 1
        elif date[1] == 2:
            yearvalue = yearvalue - 1
    monthvalue = monthvalues[date[1]]
    dayvalue = date[0]
    weekdayvalue = (yearvalue + monthvalue + dayvalue) % 7
    return dayvalues[weekdayvalue]

print datearithmetik('12.09.2008')
Dieser kleine Funktion berechnet vom Datum ausgehen, denn Wochentag.

Hoffe das diese Funktion euch irgendwann helfen wird.

MfG
BasterTWO
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Viel Arbeit für nichts. Das kann Python in einer Zeile:

Code: Alles auswählen

>>> from datetime import date
>>> ["Mo","Di","Mi","Do","Fr","Sa","So"][date(2008,9,13).weekday()]
'Sa'
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Und was spricht gegen das "datetime" Modul?

€dit:
Jaja...zu spät.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Zu dem Code fällt mir einiges auf: Wozu wird "math" importiert? "monthvalues" und "yearvalues" könnten Listen sein, keine Dictionaries. Die Variablen alle auf "values" enden zu lassen ergibt schlechte nicht deskriptive Namen. "filter" als Name überschreibt eine eingebaute Funktion. "\d\d" ist IMHO kürzer und daher lesbarer als "\d{2}". Ist dir bewusst, das "." im regulären Ausdruck als "\." geschrieben sein müsste? Bei None sollte man "is" bzw. "is not" benutzen, allgemein würde ich aber nutzen, dass None als falsch gilt was "if" angeht und daher reicht ein "if date:". Die "date"-Zuweisung besser als "day, month, century, year = map(int, m.groups())" schreiben. Ein "changeyear" ist ein "leapyear". Benutze NIEMALS "== True" oder "== False" zusammen mit "if" -- das ist stottern und schlechter Stil. Aus den 8 Zeilen zum Test auf ein Schaltjahr kann man eine machen. Man kann auch ausnutzen, dass "True==1" und "False==0" gilt. Ich bin mir desweiteren sicher, dass die Zuweisung von "year" falsch ist. Das Jahrhundert sollte doch wohl nochmal mit 100 multipliziert werden.

Den Ansatz, irgendwie nur Modulo-Werte aufzuaddieren, finde ich schließlich eher umständlich. Warum nicht die Anzahl der Tage seit Jahr 1.1.0 berechnen, wissen, welcher Wochentag das war und jetzt einmal modulo 7 anwenden? Wenn's vor 1582 funktionieren soll, noch die 10 übersprungenen Tage rausrechnen. Das wird aber schwerer, weil verschiedene Länder die Kalenderreform zum Teil erst viele Jahre später einführten.

Stefan
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Danke für die ganzen Kommentare und Eindrücke, ich wollte was eigenes schreiben weil ich auf ein PerlScript gestossen bin welches denn Wochentag auch so errechnet. Auch bin ich immer gerne offen was Style Anpassungen an geht, weil ich selber finde meine Codes kann man nie wirklich gut lesen.

Ich werde nochmal drüber schauen.

MfG
BasterTWO
Antworten