• Wieder ein Alternativ-Script zur Berechnung welcher Tag an welchem Datum war.
    z.B. 01.01.1990 ==> Montag

    [autoit]

    Func GetWeekday($M, $D, $Y)
    Static $WeekDay[7] = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
    If ($M < 3) Then
    $M += 12
    $Y -= 1
    EndIf
    $wd = Mod($D + (2 * $M) + Floor(6 * ($M + 1) / 10) + $Y + Floor($Y / 4) - Floor($Y / 100) + Floor($Y / 400) + 1, 7)
    Return $WeekDay[$wd]
    EndFunc ;==> GetWeekday() AutoIt v3.3.12.0

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; GetWeekday(Monat, Tag, Jahr)
    MsgBox(0, "Get Weekday", GetWeekday(1, 1, 1990)) ; 1990-01-01 --> Montag
    MsgBox(0, "Get Weekday", GetWeekday(4, 15, 2014)) ; 2014-04-15 --> Dienstag
    MsgBox(0, "Get Weekday", GetWeekday(9, 9, 1999)) ; 1999-09-09 --> Donnerstag

    [/autoit]

    2 Mal editiert, zuletzt von kaesereibe (24. Juli 2014 um 11:55)

  • Man könnte aber auch einfach das hier machen:

    [autoit]

    #include <Date.au3>

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "", _DateDayOfWeek(_DateToDayOfWeek(@YEAR, @MON, @MDAY)))

    [/autoit]

    :P
    (Hab schon lange nichtmehr etwas in AutoIt geschrieben, sollte aber funktionieren. :whistling: )

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Hab mal die Geschwindigkeit getestet.
    In beiden Versuchen war meine Funktion schneller als die Build-In Funktion =)

    Code
    While $i <> 100000 | _DateDayOfWeek(_DateToDayOfWeek(1990, 1, 1))    ==> 5.168 sec | 3.294 sec
    While $i <> 100000 | GetWeekday(1, 1, 1990)                          ==> 3.274 sec | 1.613 sec


    edit:
    - Schneller weil kein Fehlerüberprüfung, da ich eigtl davon ausgehe, dass "Leute" wissen wie man ein Datum richtig schreibt.

    Einmal editiert, zuletzt von kaesereibe (24. Juli 2014 um 16:00)

    • Offizieller Beitrag

    In beiden Versuchen war meine Funktion schneller als die Build-In Funktion =)


    Wenn man sich den prozentualen Gewinn von ca. 50% anschaut, sieht das wirklich enorm aus. Aber wir wollen mal realistisch bleiben: Solch ein Aufruf erfolgt niemals 100.000 mal nacheinander (nur da wäre ein effektiver Gewinn zu verzeichnen). Ich halte nicht viel von einsatzfremden Zeituntersuchungen. Ein Befehl wie dieser, der in der Regel einmal aufgerufen wird, fällt auch bei der Nutzung der AutoIt-UDF zeitmäßig überhaupt nicht ins Gewicht.
    Im übrigen hinkt der Vergleich ganz gewaltig. Denn die UDF hat intern noch ein gründliches Errorhandling, das natürlich auch Zeit beansprucht. Deshalb ist ein Vergleich von UDF und Standalone-Lösungen immer der Vergleich von Äpfeln und Birnen. ;)

  • edit:
    - Schneller weil kein Fehlerüberprüfung, da ich eigtl davon ausgehe, dass "Leute" wissen wie man ein Datum richtig schreibt.


    Nun, bei soetwas geht es in der Regel ja um Benutzereingaben, und da muss man ja heutzutage mit dem Worst-Case-Szenario rechnen, also einem DAU. ^^
    Bei deiner Variante müsste der Programmierer das Errorhandling selber schreiben, Zeit ist ja bekanntlich Geld

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    da ich eigtl davon ausgehe, dass "Leute" wissen wie man ein Datum richtig schreibt.


    Dieser Denkansatz fällt dir spätestens dann auf die Füße, wenn du mal eine Anwendung für Jedermann schreibst. Nicht irgendein 10-Zeilentool, sondern ein komplexes Programm (Warenwirtschaft, Bestandsverwaltung oder irgendwas in der Art). Errorhandling frißt dabei fast 2/3 deines Skriptes und dass die User dann doch noch Dinge mit deinem Programm anstellen, die aus deiner vernunftbegabten Programmierersicht so abartig sind, dass sie doch gar nicht auftreten können, merkst du nach dem ersten Lauf der Beta.
    Ich habe Programme zum Testen immer meiner Tochter gegeben, als die klein war. Ich habe ihr nie gesagt, worum es geht, sondern einfach nur: Probier mal, was man damit machen kann. Das ist die beste Variante Fehleingaben zu finden. :D

  • Klar habt ihr beide damit was ihr sagt recht, aber mein Grundgedanke bei der Funktion war im ersten einfach nur zu zeigen, wie man das alternativ berechnen kann, ohne jetzt die Größe der Funktion zu verdoppeln oder zu verdreifachen um Fehlerquellen der User zu vermeiden. =)

  • Mal ganz abgesehen davon, dass die Funktion auch für "falsche" Daten (z.B. negative oder zu große Zahlen) funktioniert, das Ergebnis stimmt dann nur eben nicht. Da es für diese Daten aber auch keinen passenden Wochentag gibt kann man darüber wahrscheinlich hinwegsehen.

    Über welchen Zeitraum funktioniert diese Funktion eigentlich? Momentan scheint es ja zu passen, aber durch die Änderungen in unserem Kalender in den letzten paar tausend Jahren wird es doch garantiert ab einem gewissen Zeitpunkt in der Vergangenheit nicht mehr funktionieren, oder?

  • durch die Änderungen in unserem Kalender in den letzten paar tausend Jahren wird es doch garantiert ab einem gewissen Zeitpunkt in der Vergangenheit nicht mehr funktionieren, oder?

    Funktioniert erst ab dem 15.10.1582.
    Alles davor wären Angaben im julianischen Kalender.
    Wobei der Zeitraum 4.-14. Oktober 1582 in beiden Kalendern nicht existierten.
    Eindeutig wird es erst mit der Angabe des julianischen Datums (<> julianischer Kalender).

    Im Anhang habe ich mal einen kleinen Kalenderrechner drangehängt.

    • Offizieller Beitrag

    Auch für die Zukunft sind alle Kalenderberechnungen unter Vorbehalt. Bis jetzt sind m.W. nur bis zum Jahr 2999 die Regelungen für Schaltjahre gültig. Da die Abweichung der Tageslängen nicht konstant ist, sondern mehr oder weniger starken Schwankungen unterliegt, kann auch jederzeit entschieden werden einen zusätzlichen Schalttag einzuführen (oder auch umgekehrt einen zu streichen).
    Vermutlich wird das aber unsere Programmieraktivitäten nicht mehr beeinflussen, das können wir dann unseren Ur-Ur-...Enkeln aufhalsen. ;)

  • Fest ist auch bis ins Jahr 2999 nichts.
    Das kommt schlicht darauf an wie die Erdrotation sich bis dato verhält und ob ein Schalttag notwendig ist.
    Ein Gesetz gibt es da nicht.

    Meines Wissens kann man aber vom derzeitigen langfristigen Rotationsverhalten (also auch die Verringerung der Winkelgeschwindigkeit) davon ausgehen, dass ein zusätzlicher Schalttag für den gregorianischen Kalender erst im Jahre 3333+ nötig sein wird.
    Astronomische Großereignisse mal außer acht gelassen.