Zeit vergleichen



  • Hallo alle zusammen,

    ich hab wieder mal ein kleines Problem.
    Ich möchte Aktuelle Zeit mit den gespeicherten in einem *.INI File vergleichen und dem entsprechend die Sicherung starten, aber es klappt nicht.

    Mein Ausdruck:

    //1. Wenn automatische Sicherung aktiviert ist
      if(aSicherung == 1)
    	 {
    	//Wenn eingestellte Zeit mit aktueller übereinstimmt
    	if(StrToTime(zeit1) == Time())
    	sicherung(); //Sicherung durchfuehren
             //zeit1 ist ausgelesener aus *.INI Datei String  
    	}
    

    Der Ausdruck ist nie war?
    Was ist falsch?



  • Das kann diverse Ursachen haben. Die wahrscheinlichste ist die Ungenauigkeit beim Rechnen mit double Werten. Ich würd es mal mit der Funktion MinutesBetween aus der DateUtils versuchen.



  • Sorry, MinuteSpan() wäre die richtige Funktion...



  • Hi,

    lass dir doch mal StrToTime(zeit1) ausgeben und vergleiche es mit dem Time() - Format

    mfg, Micha!



  • Danke für schnelle Antworten,

    Ausgabe von StrToTime(zeit1) sieht korrekt aus!
    Ach ja ich hab das geschribene in einem Timer mit Interval auf 1 (1 Millisekunde)eingestellt.
    Werde gleich mit MinuteSpan() probieren.



  • Hallo,

    die Methode MinuteSpan() funktioniert auch nicht.

    //1. Wenn automatische Sicherung aktiviert ist
      if(aSicherung == 1)
    
    		{
    		//Wenn eingestellte Zeit mit aktuelle übereinstimmt
    		if(MinuteSpan(StrToTime(zeit1), Time()) == 0)
    		sicherung(); //Sicherung durchfuehren
    		}
    

    Was kan man noch machen?



  • In welchem Zeitintervall prüfst du denn, ob die Sicherung gemacht werden soll?
    Evtl. sind deine Prüfzeiten zu grob, oder die Auflösung deiner Zeit in der Ini Datei ist zu fein.

    MinuteSpan ist wahrscheinlich auch nicht ganz korrekt für deinen Fall:

    Im Unterschied zur Funktion MinutesBetween, die nur ganze Minuten berücksichtigt, meldet MinuteSpan nicht vollständig verstrichene Minuten gegebenenfalls als Bruch

    Das ist nicht das, was du willst. Was passiert überhaupt, wenn du nicht ganz genau (also ganz ganz genau) diesen Zeitpunkt triffst, der in der *.ini Datei steht?

    Ein Vergleich mit > (oder auf ein 'nachher' )ist bestimmter sinnvoller als ein Test auf absolute Gleichheit



  • du bist dir sicher, dass du die TDateTime-Werte bis zur letzten Stelle gleich haben willst? TDateTime ist eigentlich ein Double-wert

    Bsp: Time() = 0.658566689814815
    StrToTime("15:46:00,0") = 0.656944444444444

    wie oft kontrollierts du denn welchen Wert Time() hat?



  • jede 1 Millisekunde.
    Da ich nicht auf sekunden genau sein muss habe ich den Interval auf 1000 (1 sek) gesetzt und trotzdem kein Erfolg der überspringt die Zeit und passiert gaar nichts.



  • Soweit ich das verstanden habe, muß es auf die Minute genau sein, also setz das Interval auf 60000. Alles andere ist Ressourcen-Verschwendung!
    Zeig mal Deinen aktuellen Quelltext.

    Ich hatte übrigens mal ein ähnliches Problem und habe es folgenderweise gelöst:
    ein WORD, das Hi-Byte die Stunde, das Lo-Byte die Minute. Läßt sich absolut einfach vergleichen und man kann sogar die Werte halbwegs verstehen (im Gegensatz zu 0.86333172, wer kann das schon im Kopf ausrechnen).

    Gruß,
    Christian



  • Hi,
    ich hab das Beispiel gerade mal wieder rausgekramt. War doch ein bißchen anders als oben beschrieben (kein WORD), aber ähnlich:

    GetLocalTime(&time);
        nDay = time.wDayOfWeek - 1;
        if(nDay < 0)
            nDay += 7;
        nTime = time.wHour * 60 + time.wMinute;    // Der für Dich interessante Teil
    ...
        // Abfrage per SQL ...
        qry->SQL->Add("SELECT * FROM tbl_timers WHERE Timer_Day="+String(nDay));
        qry->SQL->Add("AND Timer_Time="+String(nTime));
        // ... das kannst Du natürlich gerne auch anders machen:
        if(zeit1 == nTime)    // Falls zeit1 das gleiche Format benutzt ;)    
            HauDenLukas();
    

    Gruß,
    Christian

    PS: überprüft habe ich per Timer, jedesmal 3 Sekunden nach dem Minutenwechsel (damit auch ja nichts verschütt geht):

    // Nächster TiCheckTimer erst um 3 Sekunden nach dem nächsten
        // Minutenwechsel!!!
        GetLocalTime(&time);
        TiCheckTimer->Interval = (63 - time.wSecond) * 1000;
    


  • Ich hab das grade etwas anders gelöst und zwar die Differnz von Double Wert in Integeren konvertiert und mit 0 verglichen , und endlich Funktioniert es.

    Mein Code:

    //1. Wenn automatische Sicherung aktiviert ist
      if(aSicherung == 1)
    	  {
    	   if(tage == 0)
    			{
    			//Wenn eingestellte Zeit mit aktuelle übereinstimmt
    			if( int(MinuteSpan(StrToTime(zeit1), Time())) == 0)
    			sicherung(); //Sicherung durchfuehren
    			}
               }
    

Anmelden zum Antworten