Arbeitszeit Rechner

  • Hallo Leute,

    ich will mit AutoIt ein Programm machen mit das mir Anzeigt wie viel
    Jahre Monate Wochen Tage Stunden Minuten und Sekunden ich noch Abreiten muss bis meine Lehre zu ende ist.

    Also muss dieser von Montag bis Freitag je Tag 8 Std und Samstags 4 Std Rechnen.
    (40 - 44|48 Std. Woche) Das Wochenende soll er nicht mit Zählen.
    Da es aber Monate gibt mit mehreren Tagen sollte dies berücksichtig werden. Ist dies möglich?
    Kann mir da jemand so ein Code machen?! Wäre echt geil =)

    Würde sogra 5 € via Pay Pal dann springen lassen.

  • Warum versuchst Du es nicht selber?
    Es gibt eine super HIlfe die Du dir auf die Festplatte kopieren kannst und sonst steht Dir ein hilfsbereites Forum doch eigentlich auch zur Verfügung.

    Also Du könntest zum Beispiel ein Programmablaufplan erstellen.
    Startdatum = aktuelle Zeit
    Enddatum = Tag wo alles ein Ende hat ;)
    Dann berechnest Du erst einmal die Tage in dem Du das größere Datum vom kleineren Datum ab ziehst (Minus). Das wäre dann doch schon die erste Hürde und die zweite nimmt man dann zugleich ;) Du wirst sehen, wenn Du erst einmal Erfolg hast, dann macht AutoIt fast schon süchtig.

    Also, ran und bekomme wieder SPASS an der Lehre. Wenn ich das so lese denke ich das DIR die Ausbildung keinen SPASS macht.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi,

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Date.au3>

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

    Global $hours = 0, $date = _NowCalcDate(), $days = 0, $end = '2009/08/05'
    Global $month = _DateDiff('M', $date, $end), $years = _DateDiff('Y', $date, $end), $weeks = _DateDiff('w', $date, $end)

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

    While True
    $date = _DateAdd('d', 1, $date)
    $split = StringSplit($date, "/")
    If (Not @error) And ($split[0] = 3) Then
    Switch _DateToDayOfWeek($split[1], $split[2], $split[3])
    Case 2 To 6
    $hours += 8
    $days += 1
    Case 7
    $hours += 4
    $days += 1
    EndSwitch
    EndIf
    If ($date = $end) Then ExitLoop
    WEnd

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

    MsgBox(0, "", $years & @TAB & ' Jahre' & @CRLF & $month & @TAB & ' Monate' & @CRLF & $weeks & @TAB & ' Wochen' & @CRLF & '____________________' & @CRLF & @CRLF & $days & @TAB & ' Tage' & @CRLF & $hours & @TAB & ' Stunden' & @CRLF & $hours * 60 & @TAB & ' Minuten' & @CRLF & $hours * 60 * 60 & @TAB & ' Sekunden')

    [/autoit]

    //Edit: Die Jahre, Monate und Wochen Werden relativ genommen, also mit Wochenenden. Wenn du das nicht möchtest musst du das noch umrechnen, sollte aber nicht schwer sein, da du das mit den Tagen ganz leicht ausrechnen kannst.

    Ich bin jetzt mal davon ausgegangen:

    Mo-Fr --> 8 Stunden
    Sa --> 4 Stunden
    So --> 0 Stunden

    Ich hoffe ich hab das richtig verstanden. Allerdings musst du dir bewusst sein, dass es Feiertage nicht mitrechnen kann und auch sonst bestimmt einige Unstimmigkeiten auftreten werden. Ansonsten hast du uns auch nicht gesagt wann deine Lehre um ist. Ich hab jetzt einfach mal irgendein wahlloses Datum erfunden.

    mfg anno2008

    3 Mal editiert, zuletzt von anno2008 (22. Juni 2009 um 14:37)

  • Ich glaube da ist was falsch.

    Ist nicht die Zeit zwischen dem 01.01.2009 und dem 31.12.2009
    1 Jahr
    12 Monate
    52 Wochen
    365 Tage
    usw. ???

    Siehe Bild was aber da raus kommt. ;)
    autoit.de/wcf/attachment/5250/

    Und so:

    Spoiler anzeigen
    [autoit]

    $date = '2009/01/01', $days = 0, $end = '2010/01/01'

    [/autoit]


    Stimmen die ersten drei Angaben in der MsgBox, aber der Rest immer noch nicht.

    Habe geschaut ob ich den Fehler beheben kann, aber komme nicht auf die Idee.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo anno2008,

    das Skript muss so aussehen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Date.au3>

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

    ;Global $hours = 0, $date = _NowCalcDate(), $days = 0, $end = '2009/08/05'
    Global $hours = 23.599, $date = '2008/12/31' , $days = 0, $end = '2009/12/31'
    Global $month = _DateDiff('M', $date, $end), $years = _DateDiff('Y', $date, $end), $weeks = _DateDiff('w', $date, $end)

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

    While True
    $date = _DateAdd('d', 1, $date)
    $split = StringSplit($date, "/")
    If (Not @error) And ($split[0] = 3) Then
    Switch _DateToDayOfWeek($split[1], $split[2], $split[3])
    Case 2 To 6
    $hours += 8
    $days += 1
    Case 7
    $hours += 4
    $days += 1
    EndSwitch
    EndIf
    If ($date = $end) Then ExitLoop
    WEnd

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

    MsgBox(0, "", $years & @TAB & ' Jahre' & @CRLF & $month & @TAB & ' Monate' & @CRLF & $weeks & @TAB & ' Wochen' & @CRLF & '____________________' & @CRLF & @CRLF & $days & @TAB & ' Tage' & @CRLF & $hours & @TAB & ' Stunden' & @CRLF & $hours * 60 & @TAB & ' Minuten' & @CRLF & $hours * 60 * 60 & @TAB & ' Sekunden')

    [/autoit]

    dadurch dass du die Differenz berechnest unterschlägts du einen Tag,

    mfg (Auto)Bert

    • Offizieller Beitrag

    Hi,
    hier kannst du die zutreffenden Feiertage mit berücksichtigen. Falls diese auf Samstag oder Wochentag fallen, wird das in der Berechnung berücksichtigt.
    Der heutige Tag wird bei der Berechnung nicht berücksichtigt.
    Hab es nicht von Hand nachgerechnet, ob es paßt :D.

    Edit: Noch 'nen Bug gefunden ;)

    Spoiler anzeigen
    [autoit]

    #include <DateTimeConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include <Date.au3>
    #include <StaticConstants.au3>

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

    Local $ret = _Feiertage(2009, 0)
    _ArraySort($ret, 0, 0, 0, 1)
    Global $aDays[32]
    Local $gui, $date, $style = "yyyy-MM-dd", $DTM_SETFORMAT_ = 0x1032
    $gui = GUICreate('Feiertage (alphabetisch)', 350, 350)
    GUICtrlCreateLabel('Wähle das Enddatum', 10, 10, 330, 17, $SS_CENTER)
    $date = GUICtrlCreateDate('', 115, 30, 120, 20)
    GUICtrlCreateLabel('Wähle die nicht zutreffenden Feiertage ab!', 10, 60, 330, 17, $SS_CENTER)
    Local $x = 10, $y = 85
    For $i = 0 To 31
    If $i = 16 Then
    $x = 170
    $y = 85
    EndIf
    $aDays[$i] = GUICtrlCreateCheckbox($ret[$i][1], $x, $y, 150, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $y += 22
    Next
    GUICtrlSendMsg($date, $DTM_SETFORMAT_, 0, $style)
    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Global $cntDayDelete = 0, $samstag = 0, $freeSat = 0
    Local $ToDate = StringReplace(GUICtrlRead($date), '-', '/'), $ToYear = StringLeft($ToDate, 4)
    Local $ToM_D = StringRight($ToYear, 6)
    Local $currYear = @YEAR, $currM_D = '/' & @MON & '/' & @MDAY
    Local $cntDays = _DateDiff('D', @YEAR & '/' & @MON & '/' & @MDAY, $ToDate)

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

    For $i = 0 To UBound($aDays) -1
    If BitAND(GUICtrlRead($aDays[$i]), $GUI_CHECKED) Then
    $aDays[$i] = 1
    Else
    $aDays[$i] = 0
    EndIf
    Next

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

    Do
    Select
    Case $currYear < $ToYear
    _check($currYear, $currM_D, '/12/31')
    $currM_D = '/01/01'
    Case $currYear = $ToYear
    _check($currYear, $currM_D, $ToM_D)
    EndSelect
    $currYear += 1
    Until $currYear > $ToYear

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

    Func _check($Year, $start, $end)
    Local $ind, $aFT = _Feiertage($Year, 0, 1), $day = $Year & $start
    _ArraySort($aFT, 0, 0, 0, 1)
    While $day <= $Year & $end
    $ind = _ArraySearch($aFT, $day)
    If Not @error Then
    If $aDays[$ind] And (Not StringInStr('1 7', $aFT[$ind][2])) Then $cntDayDelete += 1
    If $aDays[$ind] And ($aFT[$ind][2] = 7) Then $freeSat += 1
    EndIf
    Switch _DateToDayOfWeek(StringLeft($day,4), StringMid($day,6,2), StringRight($day,2))
    Case 1
    $cntDayDelete += 1
    Case 6
    $samstag += 1
    EndSwitch
    $day = _DateAdd('D', 1, $day)
    WEnd
    EndFunc
    ConsoleWrite('abzuziehende Sonn- u. Feiertage: ' & $cntDayDelete & @CRLF)
    ConsoleWrite('Samstage ges.: ' & $samstag & @CRLF)
    ConsoleWrite('Samstage frei: ' & $freeSat & @CRLF & @CRLF)
    ConsoleWrite('Arbeitszeit:' & @CRLF & ' Wochentage: ' & @TAB & $cntDays & ' x 8h = ' & $cntDays*8 & @CRLF)
    ConsoleWrite('+ Samstage:' & @TAB & $samstag-$freeSat & ' x 4h = ' & ($samstag-$freeSat)*4 & @CRLF)
    ConsoleWrite(@TAB & @TAB & @TAB & ' = ' & $cntDays*8 + ($samstag-$freeSat)*4 & @CRLF)

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Funktion _Feiertage($Jahr)
    ;
    ; gibt die Feiertage des übergebenen Jahres
    ; als sortiertes Array[TT.MM.JJJJ od. JJJJ/MM/TT][Feiertag] zurück (gegliedert fix/variabel)
    ; $DateTyp 1 - Datum als TT.MM.JJJJ (Standard)
    ; 0 - Datum als JJJJ/MM/TT
    ; $wDay 0 - keine Rückgabe Wochentag (Standard)
    ; 1 - Rückgabe Wochentag ($array[n][2])
    ; Autor BugFix ([email='bug_fix@web.de'][/email])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Feiertage($year, $DateTyp=1, $wDay=0)
    Local $4AdvDat, $3AdvDat, $2AdvDat, $1AdvDat, $TotSoDat, $BuBDat, $MutterDat, $ErnteDat, $tmp
    Local $HDays[32][2], $a, $b, $c, $d, $e, $H1, $H2, $N, $M
    ;fixe Feiertage
    $HDays[0][0] = $year & "/01/01\Neujahr"
    $HDays[1][0] = $year & "/01/06\Heilige Drei Könige"
    $HDays[2][0] = $year & "/02/14\Valentinstag"
    $HDays[3][0] = $year & "/05/01\Maifeiertag"
    $HDays[4][0] = $year & "/10/03\Tag der Deutschen Einheit"
    $HDays[5][0] = $year & "/10/31\Reformationstag"
    $HDays[6][0] = $year & "/11/01\Allerheiligen"
    $HDays[7][0] = $year & "/12/24\Heiligabend"
    $HDays[8][0] = $year & "/12/25\1. Weihnachtsfeiertag"
    $HDays[9][0] = $year & "/12/26\2. Weihnachtsfeiertag"
    $HDays[10][0] = $year & "/12/31\Silvester"
    ;variable Feiertage
    $a = Mod($year, 19)
    $b = Mod($year, 4)
    $c = Mod($year, 7)
    $H1 = Int($year / 100)
    $H2 = Int($year / 400)
    $N = 4 + $H1 - $H2
    $M = 15 + $H1 - $H2 - Floor (Int((8 * $H1 + 13) / 25))
    $d = Mod((19 * $a + $M), 30)
    $e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7)
    If $d + $e = 35 Then
    $Easter = 50
    Else
    If $d = 28 And $e = 6 And $a > 10 Then
    $Easter = 49
    Else
    $Easter = 22 + $d + $e
    EndIf
    EndIf
    If $Easter < 32 Then
    $EasterDay = $Easter
    $EasterMonth = "03"
    Else
    $EasterDay = $Easter - 31
    $EasterMonth = "04"
    EndIf
    If $EasterDay < 10 Then
    $EasterDay = "0" & $EasterDay
    EndIf
    If $year < 1900 Then ; Datumsoperationen nur mgl. wenn > 1900 , Jahr wird konvertiert
    $RestJahr = Mod($year, 100)
    If _DateIsLeapYear($year) Then
    If $RestJahr < 10 Then
    $RestJahr = "0" & $RestJahr
    EndIf
    $Tempyear = 20 & $RestJahr
    Else
    If $RestJahr < 10 Then
    $RestJahr = "0" & $RestJahr
    EndIf
    $Tempyear = 19 & $RestJahr
    EndIf
    $EasterDate = $Tempyear & "/" & $EasterMonth & "/" & $EasterDay
    Else
    $EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
    EndIf
    $WFastDate = _DateAdd( 'd', -52, $EasterDate)
    $RosDat = _DateAdd( 'd', -48, $EasterDate)
    $FastDat = _DateAdd( 'd', -47, $EasterDate)
    $AschDat = _DateAdd( 'd', -46, $EasterDate)
    $GrDoDat = _DateAdd( 'd', -3, $EasterDate)
    $KarDat = _DateAdd( 'd', -2, $EasterDate)
    $OSaDat = _DateAdd( 'd', -1, $EasterDate)
    $OSoDat = $EasterDate
    $OMoDat = _DateAdd( 'd', 1, $EasterDate)
    $HiFaDat = _DateAdd( 'd', 39, $EasterDate)
    $PfSoDat = _DateAdd( 'd', 49, $EasterDate)
    $PfMoDat = _DateAdd( 'd', 50, $EasterDate)
    $FroDat = _DateAdd( 'd', 60, $EasterDate)
    ; Ermitteln nicht von Ostern abhängiger, veränderlicher Feiertage
    ; Muttertag = 2. Sonntag im Mai ABER wenn Pfingsten = 2.Sonntag im Mai dann ist Muttertag am 1. Sonntag
    ; Der 2. Sonntag kann nur zw. dem 8. u. 14.5. liegen
    For $maitag = 8 To 14
    If _DateToDayOfWeek($year, 5, $maitag) = 1 Then
    If $maitag < 10 Then
    $maitag = "0" & $maitag
    EndIf
    $MutterDat = $year & "/05/" & $maitag
    If $MutterDat = $PfSoDat Then
    $MutterDat = _DateAdd( 'd', -7, $year & "/05/" & $maitag)
    EndIf
    ExitLoop
    EndIf
    Next
    ; Erntedankfest 1. Sonntag im Oktober (zw. 1. u. 7.10.)
    For $oktobertag = 1 To 7
    If _DateToDayOfWeek($year, 10, $oktobertag) = 1 Then
    $oktobertag = "0" & $oktobertag
    $ErnteDat = $year & "/10/" & $oktobertag
    ExitLoop
    EndIf
    Next
    ; 4.Advent = Sonntag vor 25.12. (zw. 18. u. 24.12.)
    For $deztag = 18 To 24
    If _DateToDayOfWeek($year, 12, $deztag) = 1 Then
    $4AdvDat = $year & "/12/" & $deztag
    $3AdvDat = _DateAdd( 'd', -7, $4AdvDat)
    $2AdvDat = _DateAdd( 'd', -14, $4AdvDat)
    $1AdvDat = _DateAdd( 'd', -21, $4AdvDat)
    $TotSoDat = _DateAdd( 'd', -28, $4AdvDat)
    $BuBDat = _DateAdd( 'd', -32, $4AdvDat)
    ExitLoop
    EndIf
    Next
    $HDays[11][0] = $WFastDate & "\Weiberfastnacht"
    $HDays[12][0] = $RosDat & "\Rosenmontag"
    $HDays[13][0] = $FastDat & "\Fastnacht"
    $HDays[14][0] = $AschDat & "\Aschermittwoch"
    $HDays[15][0] = $GrDoDat & "\Gründonnerstag"
    $HDays[16][0] = $KarDat & "\Karfreitag"
    $HDays[17][0] = $OSaDat & "\Ostersamstag"
    $HDays[18][0] = $OSoDat & "\Ostersonntag"
    $HDays[19][0] = $OMoDat & "\Ostermontag"
    $HDays[20][0] = $HiFaDat & "\Christi Himmelfahrt"
    $HDays[21][0] = $PfSoDat & "\Pfingstsonntag"
    $HDays[22][0] = $PfMoDat & "\Pfingstmontag"
    $HDays[23][0] = $MutterDat & "\Muttertag"
    $HDays[24][0] = $FroDat & "\Fronleichnam"
    $HDays[25][0] = $ErnteDat & "\Erntedankfest"
    $HDays[26][0] = $BuBDat & "\Buß- und Bettag"
    $HDays[27][0] = $TotSoDat & "\Totensonntag"
    $HDays[28][0] = $1AdvDat & "\1. Advent"
    $HDays[29][0] = $2AdvDat & "\2. Advent"
    $HDays[30][0] = $3AdvDat & "\3. Advent"
    $HDays[31][0] = $4AdvDat & "\4. Advent"
    _ArraySort($HDays, 0, 0, 10)
    _ArraySort($HDays, 0, 11)
    If $wDay Then ReDim $HDays[32][3]
    For $i = 0 To 31
    If $DateTyp Then ; Datum konvertieren zu TT.MM.JJJJ
    $tmp = StringSplit($HDays[$i][0], "\", 2)
    $HDays[$i][0] = StringRight($tmp[0],2) & "." & StringMid($tmp[0],6,2) & "." & StringLeft($tmp[0],4)
    $HDays[$i][1] = $tmp[1]
    If $wDay Then $HDays[$i][2] = _DateToDayOfWeek(StringLeft($tmp[0],4), StringMid($tmp[0],6,2), StringRight($tmp[0],2))
    Else
    $HDays[$i][1] = StringTrimLeft($HDays[$i][0], 11)
    $HDays[$i][0] = StringLeft($HDays[$i][0], 10)
    If $wDay Then $HDays[$i][2] = _DateToDayOfWeek(StringLeft($HDays[$i][0],4), StringMid($HDays[$i][0],6,2), StringRight($HDays[$i][0],2))
    EndIf
    Next
    Return $HDays
    EndFunc ;==>_Feiertage

    [/autoit]
  • Klar, wenn du eine While-Schleife baust, und einen SleepBefehl (1000), dann kannst du runter zählen lassen...