Datum vergleichen

  • Hallo leute,

    ich hätte da eine kleine und kurze Frage. Kurz vorweg wie ich zwei Datum vergleiche weiß ich, ist ja wohl nicht so schwer. Nur weiß ich nicht, wenn das gelesen Datum mit dem heutigem Datum älter ist und es was bestimmtes ausgibt. Z.B.:

    Spoiler anzeigen
    [autoit]

    $Date = "25.11.2009"

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

    If $Date = @MDAY & "." & @MON & "." & @YEAR Then ;Wenn $Date gleich ist
    ;funktion
    ElseIf ;[...] Wenn $Date älter ist
    ;Funktion
    EndIf

    [/autoit]
  • Hallo Mehmex,

    bei deinem Lösungsansatz wird in den ElseIf-Zweig verzweigt wenn das Datum ungliech ist, du müsstest also prüfen ob das Jahr kleiner ist, wenn ja ist Datum kleiner, ansonsten wenn Jahr gleich ob Monat kleiner ist, wenn ja ist Datum kleiner, ansonsten wenn Monat gleich ob der Tag kleiner ist, wenn ja ist das Datum kleiner.
    Einfacher bzw. eleganter (weniger Code) sollte es über _DateDiff zu lösen sein , schau dir doch dazu die Hilfe an. Nach dem Mittagessen skripte ich mal ein Beispiel dazu (bin z. Z. auf Reha)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <StaticConstants.au3>
    #include <Date.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    ;#Include <GuiStatusBar.au3> ;Schwierigkeiten beim Resizen 1 Linie + 1 Label tuns auch

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

    Opt('GUIOnEventMode', 1)

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

    Global $hlstvwHoly = 0
    Global $sTitel = 'Beispiel zur Nutzung der _DateDiff-Func'

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

    Local $hMainGui = GUICreate($sTitel, 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    ;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $hMainGui gespeichert
    ;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    ;Verknüpft dem Event $Gui_Event_Close mit der Funktion _End

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

    ;Menübar anzeigen
    Global $menu_help = GUICtrlCreateMenu("?", -1, 1)
    Global $item_help_auto = GUICtrlCreateMenuItem("Autor: (Auto)Bert", $menu_help)
    Global $item_help_exit = GUICtrlCreateMenuItem("Beenden", $menu_help)
    GUICtrlSetOnEvent(-1, '_End')

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

    Local $hedtDate = GUICtrlCreateDate("01.01.2009", 20, 10, 130, 25, $DTS_UPDOWN)
    ;erzeugt ein Date Steuerelement die zurückgegebene ID wird in der Variablen $hedtDate gespeichert
    GUICtrlSetFont(-1, 12)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    ;verankert das Date Steuerelement Links, rechts, oben und fixiert die Höhe
    ;beim Resizen bleibt es dadurch auf seiner Position und ändert nur die Breite

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

    GUICtrlCreateButton('&prüfen (eigenes Fenster)', 220, 10, 150, 25)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
    ;verankert den Button "Prüfen" rechts und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
    GUICtrlSetOnEvent(-1, '_CheckDate')
    ;Beim Klicken des Buttons wird die Funktion _CheckDate aufgerufen

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

    Local $hlblErgebnis = GUICtrlCreateLabel("hier steht danach das Ergebnis", 12, 50, 200)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert das Label links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    GUICtrlCreateButton('Be&enden', 220, 115, 150, 25)
    GUICtrlSetOnEvent(-1, '_END')
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)

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

    GUICtrlCreateGraphic(0, 230, 400, 2, $SS_BLACKRECT)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM)
    Global $hStatus = GUICtrlCreateLabel("", 5, 235, 400, 25)

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

    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM)
    ;verankert das Label Links, rechts und unten; fixiert die Höhe
    ;beim Resizen bleibt es dadurch auf seiner Position und ändert nur die Breite wird angepasst
    GUISetState()

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

    While 1
    Sleep(120)
    WEnd

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

    Func _End()
    GUIDelete($hMainGui)
    Exit
    EndFunc ;==>_End

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

    Func _CheckDate()
    Local $sCheckDate = GUICtrlRead($hedtDate)
    Local $iCheckDate

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

    Local $iYear = StringRight($sCheckDate,4) $iMonth = StringMid($sCheckDate,4,2), $iDay = StringLeft($sCheckDate,2)
    Local $iCheckDate = _DateDiff( 'd',$iYear & "/" & $iMonth & "/" & $iDay & " 00:00:00",_NowCalc())
    if $iCheckDate = 0 then
    $sMsg = "Datum ist gleich heute"
    ElseIf $iCheckDate < 0 then
    $sMsg = "Datum ist in der Zukunft"
    Elseif $iCheckDate > 0 Then
    $sMsg = "Datum ist in der Verganenheit"
    EndIf
    ConsoleWrite($iCheckDate & @CRLF)
    GUICtrlSetData($hlblErgebnis, $sMsg)
    GUISetState()
    EndFunc ;==>_CheckDate

    [/autoit]

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (6. Dezember 2009 um 13:46)

    • Offizieller Beitrag

    Du mußt alle 3 Möglichkeite abprüfen (> / = / < ).
    Das ließe sich so realisieren:

    [autoit]

    #include-once
    #Include <Date.au3>

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

    $d1 = @YEAR & '/' & @MON & '/' & @MDAY
    $d2 = '2009/12/04'

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

    ConsoleWrite(_GetLowerDate($d1, $d2) & @CRLF)

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

    Func _GetLowerDate($sDate1, $sDate2) ; Datumsformat: "YYYY/MM/DD[ HH:MM:SS]"
    Local $diff = _DateDiff('D', $sDate1, $sDate2)
    Select
    Case $diff < 0
    Return 2 ; das zweite Datum ist kleiner
    Case $diff = 0
    Return 0 ; beide Werte sind gleich
    Case $diff > 0
    Return 1 ; das erste Datum ist kleiner
    EndSelect
    EndFunc

    [/autoit]
  • Hey Danke, aber ich habe das Problem gerade selber gelöst!!!! :rock: Hier der Code, ich habe es zwar jetzt @Makros geschrieben, aber es funktioniert:

    Spoiler anzeigen
    [autoit]

    _IfDate("01.12.2009")

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

    Func _IfDate($Date)
    $DateSplit = StringSplit($Date, ".")

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

    $DateMDAY = $DateSplit[1]
    $DateMON = $DateSplit[2]
    $DateYEAR = $DateSplit[3]
    $NewDate = $DateYEAR & $DateMON & $DateMDAY

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

    If $NewDate < @YEAR & @MON & @MDAY Then
    MsgBox(0, "Älter", "Das Datum ist älter.")
    ElseIf $NewDate = @YEAR & @MON & @MDAY Then
    MsgBox(0, "Gleich", "Das Datum ist gleich.")
    ElseIf $NewDate > @YEAR & @MON & @MDAY Then
    MsgBox(0, "Neuer", "Das Datum ist neuer.")
    EndIf
    EndFunc

    [/autoit]

    Und zwar geht es indem ich das Datum umdrehe, also nicht so prüfe "06122009" sondern so "20091206". Denn zuerst wird das Jahr (sowie du es auch geschrieben hattest), dann der Monat und dann der Tag, in dem Sinne geprüft. Von der Logig her würde ich es so betrachten: Vom großen zum kleinen Wert.

    EDIT:// BugFix war schneller. :D Danke für eure schnelle Antworten! :thumbup:

    Einmal editiert, zuletzt von MehmeX (6. Dezember 2009 um 12:03)

    • Offizieller Beitrag

    Ich hab' auch noch eine Lösung:

    Spoiler anzeigen
    [autoit]


    MsgBox(0, '', _CheckDate('05.12.2009'))

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

    Func _CheckDate($sDate)
    Local $sNow = @YEAR & @MON & @MDAY
    $sDate = StringRegExpReplace($sDate, '(\d{2})\.(\d{2})\.(\d{4})', '$3$2$1')
    Select
    Case $sDate > $sNow
    $iReturn = 1
    Case $sDate = $sNow
    $iReturn = 0
    Case $sDate < $sNow
    $iReturn = 2
    EndSelect
    Return $iReturn
    EndFunc

    [/autoit]
  • Hallo zusammen.

    Also wenn ich Datum ./. Datum habe, dann arbeite ich immer mit folgendem Script bzw. mit deren Funktionen.
    Der Entwickler nennt es liebevoll "alinadatum", wie im Script zu lesen.

    Das Script macht aus 01.01.2010 dann 021001 (021 ist das Jahr ; 001 der erste Tag in dem Jahr). So bekommt der letzte Tag in diesem Jahr die Nummer 020365 und der darauffolgende Tag (Neujahr 2010) hat ja die 021001.

    Also wenn die Zahl größer ist als die aktuelle, ist es die Zukunft, ist sie gleich ist es der gleiche Tag und sonst die Vergangenheit.

    Verrückte Art ein Datum zu schreiben, aber sinnvoll.

    Wer das Script geschrieben hat, kann ich beim besten "Willen" gar nicht mehr sagen. Oute Dich, wenn Du es warst. ;)

    Spoiler anzeigen
    [autoit]


    #include<Date.au3>
    #include<ButtonConstants.au3>
    #include<GUIConstantsEx.au3>
    Dim $pathINI = @ScriptDir & "\daten.INI"
    GUICreate("Datum Eingabe", 200, 120, 100, 45, -1, 0x00000018)
    $lastRealDate = GUICtrlCreateLabel('', 90, 7, 80, 17)
    $lastNr = GUICtrlCreateLabel('', 10, 30, 60, 17)
    $lastDate = GUICtrlCreateLabel('', 90, 30, 60, 17)
    $aktNr = GUICtrlCreateLabel('', 10, 63, 60, 17)
    $file = GUICtrlCreateInput ( "", 90, 60, 80, 20)
    $ok = GUICtrlCreateButton ("OK", 70, 90, 60, 21);, $BS_DEFPUSHBUTTON)

    If FileExists($pathINI) Then
    $val = IniReadSection($pathINI, "dat")
    $lfdnr = $val[$val[0][0]][0]
    GUICtrlSetData($lastRealDate, _REalinaDatum($val[$val[0][0]][1]))
    GUICtrlSetData($lastNr, $lfdnr)
    GUICtrlSetData($lastDate, $val[$val[0][0]][1])
    GUICtrlSetData($aktNr, StringRight('0000' & $lfdnr+1,5))
    Else
    $lfdnr = 0
    GUICtrlSetData($aktNr, '00001')
    EndIf
    GUISetState ()

    $msg = 0
    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
    Select
    Case $msg = $ok
    $date = GUICtrlRead($file)
    If $date <> '' Then
    $lfdnr += 1
    $val = StringSplit($date, '.')
    $d = StringRight('0' & $val[1],2)
    $m = StringRight('0' & $val[2],2)
    If $val[3] > 30 Then
    $y = StringRight(19 & $val[3], 4)
    Else
    $y = StringRight(20 & $val[3], 4)
    EndIf
    $date2write = StringRight('00000' & _alinaDatum($y, $m, $d),6)
    If IniWrite($pathINI, "dat" , _
    StringRight('0000' & $lfdnr,5), $date2write) <> 1 Then
    GUICtrlSetData($file, 'FEHLER')
    Else
    GUICtrlSetData($file, '')
    GUICtrlSetData($lastRealDate, _REalinaDatum($date2write))
    GUICtrlSetData($lastNr, StringRight('0000' & $lfdnr,5))
    GUICtrlSetData($lastDate, $date2write)
    GUICtrlSetData($aktNr, StringRight('0000' & $lfdnr+1,5))
    EndIf
    EndIf
    EndSelect
    Wend

    Func _alinaDatum($year, $month, $day)
    Return StringFormat('%0.3d', $year - 1989) & StringFormat('%0.3d', _dayOfyear($year, $month, $day)) ; (1989 statt 1950 startet dann bei 01.01.1989)
    EndFunc ;==>_alinaDatum

    Func _dayOfyear($year, $month, $day)
    Return _DateDiff('d', $year & '/01/01', $year & '/' & $month & '/' & $day) + 1
    EndFunc ;==>_dayOfyear

    Func _REalinaDatum($DATUM)
    Local $yyyy = StringLeft($DATUM, 3) + 1989 ; (1989 statt 1950 startet dann bei 01.01.1989)
    Local $date = _DateAdd('d', Number(StringRight($DATUM, 3))-1, $yyyy & '/01/01')
    Return StringRight($date,2) & '.' & StringMid($date,6,2) & '.' & StringLeft($date,4)
    EndFunc

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

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Und noch eine einfache Möglichkeit

    [autoit]

    #include <Date.au3>

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

    $Date1 = "1970/01/01 00:00:00"
    $Date2 = "2000/01/01 00:00:00"

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

    $Diff = _DateDiff("s", $Date1, $Date2)

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

    If $Diff = 0 Then
    MsgBox(0,"Diff","$Date1 und $Date2 sind gleich")
    ElseIf $Diff > 0 Then
    MsgBox(0,"Diff","$Date1 ist kleiner als $Date2")
    ElseIf $Diff < 0 Then
    MsgBox(0,"Diff","$Date1 ist größer als $Date2")
    EndIf

    [/autoit]


    Mfg kloklo