Seite 1 von 1

Datumsarithmetik - Wochentag vom Datum

Verfasst: Freitag 12. September 2008, 16:12
von BasterTWO
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

Re: Datumsarithmetik - Wochentag vom Datum

Verfasst: Freitag 12. September 2008, 16:21
von numerix
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'

Verfasst: Freitag 12. September 2008, 16:22
von audax
Und was spricht gegen das "datetime" Modul?

€dit:
Jaja...zu spät.

Verfasst: Samstag 13. September 2008, 07:58
von sma
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

Verfasst: Sonntag 14. September 2008, 10:29
von BasterTWO
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