Uhrzeiten: wann ist es das nächste mal 6:00 ?

  • Allgemein

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Sederic Enders.

    Uhrzeiten: wann ist es das nächste mal 6:00 ?

    Hi,

    ich weiß, das Thema Date und Uhrzeit ist ausgiebig erklärt, aber ich hab nichts passendes gefunden ;)

    und zwar will ich das Datum bestimmen, welches das Datum ist, an dem es das nächste mal z.B. 6:00 Uhr ist. Also ich will wenn es jetzt 20:00 ist das Datum morgen früh um 6:00 haben.

    wahrscheinlich steh ich grad am Schlauch^^

    By The Way, gibt es eigentlich einen Datentyp, mit dem man nur Uhrzeiten speichert? also kein Datum, welches für Year bis Day 0 drin hat^^?
    So kann man es machen. Gibt bestimmt mehrere Möglichkeiten:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim timeNow As Date = Now
    4. Dim timeNext As Date = Nothing
    5. If timeNow.Hour > 6 Then
    6. timeNext = timeNow.AddDays(1)
    7. Else
    8. timeNext = timeNow
    9. End If
    10. MessageBox.Show("Das nächste mal 06:00 Uhr ist es am: " & timeNext.ToShortDateString())
    11. End Sub
    12. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Hab ich des etz richtig verstanden?

    Ok, also danke schonmal. Ich hab des mal durchdacht, und zwar will ich die Uhrzeit (also 6:00) auch noch im Datum haben. Und des muss auch noch mit 6:15 und so gehen. Drum hab ich mir folgendes überlegt, ist aber net toll und ich weiß grad net obs stimmt. Schaut euch des mal bitte an ;)

    Spoiler anzeigen

    Erklärung:
    BestimmteZeit ist eben diese Zeit als String, also "6:15".
    Des was mit Part1 gekennzeichnet ist, entspricht

    VB.NET-Quellcode

    1. timeNext = timeNow.AddDays(1)
    und Part2 sollte das sein:

    VB.NET-Quellcode

    1. timeNext = timeNow
    , so umgeformt, dass die Uhrzeit mit im Datum ist.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim timeNow As Date = Now, timeNext As Date = Nothing
    2. If timeNow.Hour >= CUShort(My.Settings.BestimmteZeit.Split(":")(0)) Then
    3. If timeNow.Hour = CUShort(My.Settings.BestimmteZeit.Split(":")(0)) Then
    4. If timeNow.Hour >= CUShort(My.Settings.BestimmteZeit.Split(":")(0)) Then
    5. 'Part1
    6. timeNext = timeNow.Date.AddDays(1)
    7. timeNext.AddHours(CUShort(My.Settings.BestimmteZeit.Split(":")(0)))
    8. timeNext.AddMinutes(CUShort(My.Settings.BestimmteZeit.Split(":")(1)) + 15)
    9. Else
    10. 'Part2
    11. timeNext = New Date(timeNow.Year, timeNow.Month, timeNow.Day, CUInt(My.Settings.BestimmteZeit.Split(":")(0)), CUShort(My.Settings.BestimmteZeit.Split(":")(1)) + 15, 0)
    12. End If
    13. Else
    14. 'Part1
    15. timeNext = timeNow.Date.AddDays(1)
    16. timeNext.AddHours(CUShort(My.Settings.BestimmteZeit.Split(":")(0)))
    17. timeNext.AddMinutes(CUShort(My.Settings.BestimmteZeit.Split(":")(1)) + 15)
    18. End If
    19. Else
    20. 'Part2
    21. timeNext = New Date(timeNow.Year, timeNow.Month, timeNow.Day, CUInt(My.Settings.BestimmteZeit.Split(":")(0)), CUShort(My.Settings.BestimmteZeit.Split(":")(1)) + 15, 0)
    22. End If
    Mach Option Strict On, falls Du das noch nicht hast. Ich kann bei den ganzen Konvertierungen nicht erkennen, was was ist.

    Kannst Du bitte für die folgenden Fälle erklären, was herauskommen soll, wenn die Bestimmte Zeit 6:15 ist.
    • Es ist 5:00 Uhr, herauskommen soll <hier einfügen>
    • Es ist 5:59 Uhr, herauskommen soll <hier einfügen>
    • Es ist 6:00 Uhr, herauskommen soll <hier einfügen>
    • Es ist 6:14 Uhr, herauskommen soll <hier einfügen>
    • Es ist 6:15 Uhr, herauskommen soll <hier einfügen>
    • Es ist 6:16 Uhr, herauskommen soll <hier einfügen>
    • Es ist 6:59 Uhr, herauskommen soll <hier einfügen>
    • Es ist 7:00 Uhr, herauskommen soll <hier einfügen>


    Ich denke, dass es mit Worten recht schwierig ist, uns zu erklären, was Du machen willst.
    Die Beispiele sollten ausreichen, damit man weiß, was Du meinst.

    PS:
    So wie ich es im Moment verstehe:
    • Es ist 5:00 Uhr, herauskommen soll Heute 6:15
    • Es ist 5:59 Uhr, herauskommen soll Heute 6:15
    • Es ist 6:00 Uhr, herauskommen soll Heute 6:15
    • Es ist 6:14 Uhr, herauskommen soll Heute 6:15
    • Es ist 6:15 Uhr, herauskommen soll Morgen 6:15
    • Es ist 6:16 Uhr, herauskommen soll Morgen 6:15
    • Es ist 6:59 Uhr, herauskommen soll Morgen 6:15
    • Es ist 7:00 Uhr, herauskommen soll Morgen 6:15
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Sederic Enders schrieb:

    timeNext.AddHours(CUShort(My.Settings.BestimmteZeit.Split(":")(0)))
    Vermeide solche Konstrukte.
    Schreib lieber 3 Zeilen Code mehr und verstehe sie vollständig, in solch Zeilen Fehler zu finden ist in 3 Wochen praktisch unmöglich.
    Settings unterstützen auch den Type Date, nutze dies, da musst Du keine String-Operationen drauf ansetzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok danke schonmal

    @Niko Ortner: Ja genauso, wie du meinst, mein ich des auch ;) nur bei 6:15 ist es wurscht, ob heute oder morgen. Ich hab nur Option Strict off, weil ich ganz froh bin, wenns automatisch umgewandelt wird, weil ich mich da net so auskenn^^, aber du hast schon recht^^ ich machs an.
    @RodFromGermany: Ich will halt nur immer Zeilen sparen, und wenn man solche Konstrukte selber baut, dann versteht man es meistens auch ;) Ich hab des auch nur deswegen so kompliziert gemacht, weil ich drauf hoff, dass jemand eine viel einfachere Lösung hat ;)

    Ok dann nochmal der Code mit Option Stric on und Option verständlicher On ;) (und CopyPaste Fehler ausgebessert^^) :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim timeNow As Date = Now, timeNext As Date = Nothing
    2. Dim ZielZeitStr() = My.Settings.DayTimeRuleTo.Split(CChar(":"))
    3. Dim ZielStunden As Integer = CInt(ZielZeitStr(0))
    4. Dim ZielMinuten As Integer = CInt(ZielZeitStr(1)) + 15 '+15 hat nix zu bedeuten, ich will nur des Datum ein bisschen später (als z.B. 6:15) haben
    5. If timeNow.Hour >= ZielStunden Then
    6. If timeNow.Hour = ZielStunden Then
    7. If timeNow.Minute >= ZielMinuten Then
    8. 'Part1
    9. timeNext = timeNow.Date.AddDays(1)
    10. timeNext.AddHours(ZielStunden)
    11. timeNext.AddMinutes(ZielMinuten)
    12. Else
    13. 'Part2
    14. timeNext = New Date(timeNow.Year, timeNow.Month, timeNow.Day, ZielStunden, ZielMinuten, 0)
    15. End If
    16. Else
    17. 'Part1
    18. timeNext = timeNow.Date.AddDays(1)
    19. timeNext.AddHours(ZielStunden)
    20. timeNext.AddMinutes(ZielMinuten)
    21. End If
    22. Else
    23. 'Part2
    24. timeNext = New Date(timeNow.Year, timeNow.Month, timeNow.Day, ZielStunden, ZielMinuten, 0)
    25. End If
    26. MessageBox.Show("Das nächste mal " & My.Settings.BestimmteZeit & " ist es am " & timeNext.ToString())


    Die bestimmte Zeit ist als String abgespeichert, da Ich die an ne Combobox binde (über ApplicationSettings) und ich net weiß wie, ma des dann noch umformen kann. Falls da jemand ne Hilfe hat, wär ich auch dankbar^^

    Des ganze will ich übrigens machen, weil mein Programm eine Regel, wenn der "Admin" sagt, "bitte nicht beachten" diese Regel bis zum nächsten Tag, wenn sie wieder greifen würde (also um z.B. 6:15), nicht mehr angewandt wird.
    Oh ich glaube, der ErfinderDesRades hat recht ^^ Schaut relativ einfach aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'wie gehabt:
    2. Dim timeNow As Date = Now, timeNext As Date = Nothing
    3. Dim ZielZeitStr() = My.Settings.BestimmteZeit.Split(CChar(":"))
    4. Dim ZielStunden As Integer = CInt(ZielZeitStr(0))
    5. Dim ZielMinuten As Integer = CInt(ZielZeitStr(1)) + 15 '+15 hat nix zu bedeuten, ich will nur des Datum ein bisschen später (als z.B. 6:15) haben
    6. 'und dann:
    7. Dim ZielZeit As New Date(timeNow.Year, timeNow.Month, timeNow.Day, ZielStunden, ZielMinuten, 0)
    8. If ZielZeit > timeNow Then
    9. timeNext = ZielZeit
    10. Else
    11. timeNext = ZielZeit.AddDays(1)
    12. End If


    Aber man kann doch kein Date.Today zu ner Timespan addieren?!? Aber so müssts passen...

    Danke an alle

    Was mich jetzt trotzdem interessieren würde, wäre, wie man die BestimmteZeit als TimeSpan speichern kann, und des trotzdem an die Combobox binden kann.

    Sederic Enders schrieb:

    Aber man kann doch kein Date.Today zu ner Timespan addieren?!?

    Date.Today bzw. DateTime.Now ist vom Typ DateTime. (Date ist das VB-Alias für DateTime. Date und DateTime sind also identisch.)
    Dann gibt's noch TimeSpan.

    DateTime ist ein Punkt in der Zeit. (Ein Zeitpunkt.)
    TimeSpan ist eine Zeitspanne.

    Wenn man zu einem Punkt in der Zeit (z.B. 6:15 Uhr) eine Zeitspanne (z.B. 10 Minuten) dazurechnet, dann kommt ein neuer Zeitpunkt heraus (hier 6:25 Uhr).

    Dagegen kann man nicht zwei Zeitpunkte addieren. 6:15 Uhr + 5:00 Uhr funktioniert nicht.
    Was man aber machen kann, ist den Unterschied zwischen zwei Zeitpunkten herausfinden: 6:15 Uhr - 5:00 Uhr (vorausgesetzt am selben Tag) = 1 Stunde 15 Minuten.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    kling logisch, aber kann man etz zu nem Date.Today ne Timespan addieren?!? Wie würde des im Code ausschauen? is aber nimmer so wichtig, wenn mein Code etz stimmt ;)
    Interessieren würde mich trotzdem noch, ob man die TimeSpan an die Combobox binden kann :D
    @Sederic Enders:
    Klar doch und
    Klar doch.
    Allerdings ist bei solch Sachen Option Strict On zwingend erforderlich, damit Du keine Glühbirnen in den Obstsalat schnipseln kannst.
    Wozu TimeSpan-Werte in eine ComboBox? ==> NumericUpDown (hatten wir schon).
    Wie soll denn das Design aussehen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Sederic Enders:
    Ja, kann man. Ich hab mal einen kleinen Test gemacht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'DateTime-Konstruktor ist wie folgt:
    3. 'Public Sub New(year As Integer, month As Integer, day As Integer, hour As Integer, minute As Integer, second As Integer)
    4. Dim MyContainer As New ContainerClass
    5. Protected Overrides Sub OnShown(e As System.EventArgs)
    6. ComboBox_SelectedDateTime.Items.Add(New DateTime(2000, 1, 1, 0, 0, 0))
    7. ComboBox_SelectedDateTime.Items.Add(New DateTime(2001, 2, 3, 4, 5, 6))
    8. ComboBox_SelectedDateTime.Items.Add(New DateTime(2013, 3, 24, 18, 26, 0))
    9. ComboBox_SelectedDateTime.DataBindings.Add(New Binding("SelectedItem", MyContainer, "DateTimeValue"))
    10. MyBase.OnShown(e)
    11. End Sub
    12. Private Sub ShowValue() Handles Button_ShowValue.Click
    13. MessageBox.Show(MyContainer.DateTimeValue.ToLongDateString & " " & MyContainer.DateTimeValue.ToLongTimeString)
    14. End Sub
    15. End Class
    16. Public Class ContainerClass
    17. Implements System.ComponentModel.INotifyPropertyChanged
    18. Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    19. Dim _DateTimeValue As DateTime
    20. Public Property DateTimeValue As DateTime
    21. Get
    22. Return _DateTimeValue
    23. End Get
    24. Set(value As DateTime)
    25. _DateTimeValue = value
    26. RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("DateTimeValue"))
    27. End Set
    28. End Property
    29. End Class

    Auf der Form befindet sich die ComboBox_SelectedDateTime und der Button_ShowValue.
    Voraussetzung ist, dass Du der ComboBox auch wirklich DateTime-Werte für die Items gibst. Hier füge ich in Zeile 9 bis 11 Datums-Werte hinzu. Das einzige Problem, das man hier noch hat, ist, dass die Datumswerte möglicherweise nicht so angezeigt werden, wie Du das gerne hättest. Da müsstest Du Dir noch was überlegen.

    Edit: Man kann sogar einen String in die ComboBox einfügen, weil die Werte beim Binding per TypeConverter in den richtigen Typ konvertiert werden. Aus dem String "24.3.2013 18:45" wird ein Datumswert mit Tag 24, Monat 3, Jahr 2013, Stunde 18 und Minute 45 (und Sekunde 0). Das sollte man aber vermeiden. Denn die Konvertierung hängt von der Regionseinstellung ab, die auf dem aktuellen Computer eingestellt ist. Das heißt, dass die Werte in anderen Ländern möglicherweise anders konvertiert werden. Und dann wird es schwierig, den Fehler zu finden, weil auf dem eigenen Computer alles problemlos läuft.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Niko Ortner schrieb:

    VB.NET-Quellcode

    1. ComboBox_SelectedDateTime.Items.Add(New DateTime(2000, 1, 1, 0, 0, 0))
    Ich gehe mal davon aus, dass Du schon mal was von Trennung von GUI und Daten gehört hast. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok schaut schonmal gut aus, aber ich checks nonnet ganz, weil ich mit Bindings nonnet so firm bin ;)
    Erstmal, wie kann ich jetzt das in hh:mm formatieren (ich habs etz in TimeSpan geändert)
    Und wie verknüpf ich des mit meinen Settings

    ErfinderDesRades schrieb:

    Du wolltest doch wissen, wie man eine Uhrzeit ohne Datum formuliert - die Antwort heißt "TimeSpan"

    Drum hab ich doch jetzt auch im Bsp TimeSpan statt Sate verwendet :!: :?: :!:

    ErfinderDesRades schrieb:

    in den Settings kannst du einen Timespan anlegen.

    und dann? Weil ich hab sonst bei der Entwurfsansicht in Eigenschaften ApplicationSettings die Texteigenschaft auf den String festgelegt.

    Danke für die Hilfen, auch wenns jetzt gar nicht mehr umd das Ausgangsthema geht ^^