none
Uhrzeit vergleichen RRS feed

  • Frage

  • Hallo.
    Zu meinem Problem. Ich schreibe die aktuelle Uhrzeit in die Registry und würde dann gern eine if Abfrage machen ala:

    if (regTime_cur >= 9){
    MessageBox.Show("Scheinbar ist es später als 9")
    }

    Ich hoffe es ist klar was ich meine. Das funktioniert nicht, da ich regTime_cur als String Variable anlege. Das ist aber der einzige Typ der für mich möglich ist, vermutlich müsste man von einem DateTime in ein Int32 oder so umwandeln. Leider krieg ich nicht das nicht gebacken.

    Wäre dankbar!
    Dienstag, 15. Februar 2011 09:42

Antworten

  • Hallo Joe, 

    String regTime_cur = "10:08:43.0095090";
    TimeSpan timeSpan = TimeSpan.Parse(regTime_cur);
    
    if (DateTime.Today.Add(timeSpan).Hour >= 9 && DateTime.Today.Add(timeSpan).Hour <= 11)
    { 
     // Weitere Logik
    }
    
    

    Aber warum speicherst Du ein TimeSpan wenn Du nur die Stundenangabe brauchst?

    Gruss
    Marcel

    • Als Antwort markiert Joe Waynsen Dienstag, 15. Februar 2011 20:23
    Dienstag, 15. Februar 2011 12:31
    Moderator

Alle Antworten

  • Hallo Joe,

    Du könntest DateTime.Now.ToBinary() verwenden um das Datum erst in ein long-Wert umzuwandeln. Long-Werte werden als String gespeichert, wenn Du den Registry-Typ nicht konkret angibst, deshalb in diesem Fall immer RegistryValueKind.QWord angeben.

    Oder Du könntest die aktuelle Uhrzeit als String in die Registrierung schreiben und beim Einlesen dann über DateTime.Parse, DateTime.ParseExact, DateTime.TryParse, DateTime.TryParseExact wieder zu einem Datum konvertieren.

    Wenn Dir das nicht ausreicht, kannst Du das Datum auch binär serialisieren und das Bytearray in die Registry schreiben. Das könnte grob umrissen so aussehen:

    RegistryKey myKey = Registry.CurrentUser.OpenSubKey(@"Software\MyApp\MyKey", true);
    
    using (MemoryStream ms = new MemoryStream())
    {
     BinaryFormatter formatter = new BinaryFormatter();
     formatter.Serialize(ms, DateTime.Now);
     myKey.SetValue("Uhrzeit", ms.GetBuffer(), RegistryValueKind.Binary);
    
     byte[] serializedBytes = (byte[]) myKey.GetValue("Uhrzeit", null);
    
     if (serializedBytes != null)
     {
      ms.SetLength(0);
      ms.Write(serializedBytes, 0, serializedBytes.Length);
      ms.Position = 0;
      DateTime deserializedDateTime = (DateTime)formatter.Deserialize(ms);
     }
    }
    
    

    Gruss
    Marcel

    Dienstag, 15. Februar 2011 10:28
    Moderator
  • Hi,
    Zu meinem Problem. Ich schreibe die aktuelle Uhrzeit in die Registry und würde dann gern eine if Abfrage machen ala:

    if (regTime_cur >= 9){
    MessageBox.Show("Scheinbar ist es später als 9")
    }

    um dazu helfen, müsste man wissen, was genau Du da in "regTime_cur" drin stehen hast.

    Wenn da bspw. "16:31:57" o.#. steht, könntest Du bspw. versuchen, das über DateTime.TryParse( ... ) in ein Datum umzuwandeln und dann mittels <DateTimeVariable>.Hour >= 9 abzufragen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 15. Februar 2011 10:30
    Moderator
  • Versuche doch einfach die Ticks der Uhrzeit auszulesen und als string zu speichern:

    Int64 cur_time = DateTime.Now.Ticks;
    
    String uhrzeit = cur_time.toString();
    
    
    

     

    Die kannste dann einfach mit:

    DateTime f = new DateTime(Int64.Parse(uhrzeit));
    in eine Uhrzeit umwandeln
    Florian Kowalsky -> If it was helpful please mark ist as helpful!!
    Dienstag, 15. Februar 2011 10:35
  • In "regTime_cur" steht das drinnen :10:08:43.0095090

    Wie würde das anlegen dann ausschauen, ich hab das ja so:

    String regTime_cur = Convert.ToString(key.GetValue("Uhrzeit"));

     

    Wobei die Anweisung natürlich falsch sein wird, aber das einfache ändern des Types auf DateTime funktioniert nicht.

    Und wie müsste die If Abfrage samt TryParse aussehen?

    Dienstag, 15. Februar 2011 10:43
  • Hallo Florian,

    > Versuche doch einfach die Ticks der Uhrzeit auszulesen und als string zu speichern [...]

    Auch einfach:

    myKey.SetValue("Uhrzeit", DateTime.Now.ToBinary(), RegistryValueKind.QWord);
    long dateValue = (long)myKey.GetValue("Uhrzeit");
    DateTime myDate = DateTime.FromBinary(dateValue);
    

    Gruss
    Marcel

    Dienstag, 15. Februar 2011 10:47
    Moderator
  • Hallo Stefan,
    Hallo Joe

    Ich würde das so machen:

    TimeSpan timeSpan = TimeSpan.Parse("10:08:43.0095090");
    DateTime dateToCompareWith = DateTime.Today.Add(timeSpan);
    
    if (DateTime.Now >= dateToCompareWith)
    { 
    }
    
    

    Gruss
    Marcel

    Dienstag, 15. Februar 2011 11:03
    Moderator
  • Hallo Joe,

    nimm da zum Beispiel den Ansatz von Stefan Falz.
    Hier ein funktionsfähiges Beispiel:

       // Annahme:
       string regPfad = @"Software\Demo";
       string regSubName = "Zeit";
       DateTime vergleichsZeit = DateTime.Today.AddHours(9.0); //9:00 heute
       RegistryKey key = Registry.CurrentUser.CreateSubKey(regPfad);
       key.SetValue(regSubName, "10:08:43.0095090");
       
       string zeitInhalt = key.GetValue("Zeit") as string;
       var zeit = DateTime.Parse(zeitInhalt);
       bool zeitGrößer9 = zeit > vergleichsZeit;
       MessageBox.Show("Die Reg-Zeit ist " + 
        (zeitGrößer9 ? "später" : "früher oder gleich") + " als " + 
        vergleichsZeit);


    ciao Frank

    Dienstag, 15. Februar 2011 12:14
  • Danke schonmal. Ich kriegs nicht hin..

    Vielleicht sollte ich mal eben mehr von mein Source preisgeben.

    Aber als erstes muss ich mich entschuldigen, das mit der Uhrzeit in die Registry war unnötig. War ein logischer Denkfehler.

    Der Sinn dieser Applikatoin ist einen Button nur um eine bestimmte Uhrzeit zwischen 9 und 11 freizugeben. Dazu nehm ich einmal die aktuelle Windows Systemzeit.

    Meine bisherige Definition:

     

    String regTime_cur = Convert.ToString(dateTimePicker1.Value.TimeOfDay);
    
    DateTime intDatum_cur = new DateTime(Int64.Parse(regTime_cur));
    
    if (Convert.ToInt64(intDatum_cur) >= 9 && Convert.ToInt64(intDatum_cur) <= 11)

    Das funktioniert natürlich nicht.

     

    Auch mit "TimeSpan" hats bei mir nicht geklappt. Vielleicht kann man mir nocheinmal auf die Sprünge helfen. Danke!

     

     

     

    Dienstag, 15. Februar 2011 12:22
  • Hallo Joe, 

    String regTime_cur = "10:08:43.0095090";
    TimeSpan timeSpan = TimeSpan.Parse(regTime_cur);
    
    if (DateTime.Today.Add(timeSpan).Hour >= 9 && DateTime.Today.Add(timeSpan).Hour <= 11)
    { 
     // Weitere Logik
    }
    
    

    Aber warum speicherst Du ein TimeSpan wenn Du nur die Stundenangabe brauchst?

    Gruss
    Marcel

    • Als Antwort markiert Joe Waynsen Dienstag, 15. Februar 2011 20:23
    Dienstag, 15. Februar 2011 12:31
    Moderator
  • Hallo Joe,

    • ... einen Button nur um eine bestimmte Uhrzeit zwischen 9 und 11 freizugeben.

    ja, dann geht das zum Beispiel so:

       DateTime zeitAnfang = DateTime.Today.AddHours(9.0); //9:00 heute
       DateTime zeitEnde = DateTime.Today.AddHours(11.0); //11:00
       bool imZeitraum = DateTime.Now > zeitAnfang && DateTime.Now <= zeitEnde;
       MessageBox.Show("Der Button wird " + (imZeitraum ? "aktiviert." : "deaktiviert."));


    ciao Frank

    Dienstag, 15. Februar 2011 12:49
  • Danke, funktioniert wunderbar! :)

     

    Danke für die Hilfe!

    • Als Antwort markiert Joe Waynsen Dienstag, 15. Februar 2011 20:23
    • Tag als Antwort aufgehoben Joe Waynsen Dienstag, 15. Februar 2011 20:23
    Dienstag, 15. Februar 2011 15:55