vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: henrikl2000
Datum: 26.05.17 13:49

Hallo,

Ich habe eine Liste 'Public lstOnTimes As New List(Of String)' mit Tagen und Zeiten. Könnte so aussehen
Monday-17:00
Monday-17:30
Monday-18:00

Monday-20:00
Monday-20:30
Monday-21:00
Monday-21:30

Tuesday-14:00
Tuesday-14:30
Tuesday-15:00
Tuesday-15:30
Usw.

Wie kann ich jetzt von einer Sub aus entscheiden ob die aktuelle Zeit innerhalb die in der Liste angebende Zeiträume ist?

Beispiele für Monday
Die aktuelle Zeit – 17.05 = True
Die aktuelle Zeit – 17.50 = True
Die aktuelle Zeit – 19.08 = False
Die aktuelle Zeit – 20.40 = True

Ich habe einiges versucht aber kriege das nicht richtig hin.
Danke im Voraus,
Henrik

    Private Sub CheckTime()
        Dim dayOfWeek As DayOfWeek = us.Calendar.GetDayOfWeek(Date.Today)   ' 
        ' Dagens nummer eks. 3
        Dim d As String = us.DateTimeFormat.GetDayName(dayOfWeek)           ' 
        ' Det engelske navn for dagen eks. Wednesday
        'Dim t As String = Now.ToShortTimeString                             ' _
          Tid f.eks. 17.30
        Dim tsStart As TimeSpan
        Dim tsEnd As TimeSpan
        Dim count As Integer = 0
 
        actOnMotion = False
 
        For Each itm As String In lstOnTimes
            If itm.Contains(d) Then count += 1
        Next
 
        For i = 0 To lstOnTimes.Count - 1
            Dim sStr As String() = lstOnTimes(i).ToString.Split("-")
            If sStr(0) = d Then
                If i = 0 Then tsEnd = TimeSpan.Parse(sStr(1))   ' Listen vender 
                ' modsat derfor tsEnd = id 0
                If i = count Then tsStart = TimeSpan.Parse(sStr(1))
                If DateTime.Now.TimeOfDay >= tsStart AndAlso _
                  DateTime.Now.TimeOfDay <= tsEnd Then
                    actOnMotion = True
                End If
            End If
        Next
 
        Debug.Print(actOnMotion)
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: Manfred X
Datum: 26.05.17 14:48

Hallo!

In den Items Deiner String-Liste stehen offenbar Zeitpunkte.
Wie sind die Zeit-Intervalle definiert?
Ich möchte hier keine Mutmaßungen anhand Deiner Beispiele anstellen.

Wieso ist die generische Liste nicht vom Typ "DateTime".
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: henrikl2000
Datum: 26.05.17 15:03

Hallo,

Danke für deine Antwort.

Die Liste ist nicht vom Typ DateTime weil die eingetragenen Tage/Zeiten von ein DataGridView kommt.
Erster Kolonne die Zeiten von 00:00 bis 23:30 mit 30 min. Intervall. Die nächten 7 Kolonnen die Tage von Montag bis Sontag.

Sehe bitte unten

    Private Sub AddOnTimes()
        Dim selectedCellCount As Integer =
            dgvMotionPeriode.GetCellCount(DataGridViewElementStates.Selected)
 
        If selectedCellCount > 0 Then
            lstOnTimesInt.Clear()
 
            For i = 0 To selectedCellCount - 1
                Dim col As Integer = dgvMotionPeriode.SelectedCells( _
                  i).ColumnIndex
                Dim row As Integer = dgvMotionPeriode.SelectedCells(i).RowIndex
                Dim cTemp As Integer = col * 10
                Dim id As Integer
                If row < 10 Then id = cTemp & row
                If row > 9 Then id = cTemp / 10 & row
                lstOnTimesInt.Add(id)
            Next i
            CalcOnTimes()
        End If
    End Sub
 
    Public Sub CalcOnTimes()
        lstOnTimes.Clear()
 
        For Each itm In lstOnTimesInt
            Dim row As String = itm.ToString.Substring(1, 2)
 
            Select Case itm.ToString.Substring(0, 1)
                Case 1
                    lstOnTimes.Add("Monday" & "-" & lstTimes(row))
 
                Case 2
                    lstOnTimes.Add("Tuesday" & "-" & lstTimes(row))
 
                Case 3
                    lstOnTimes.Add("Wednesday" & "-" & lstTimes(row))
 
                Case 4
                    lstOnTimes.Add("Thursday" & "-" & lstTimes(row))
 
                Case 5
                    lstOnTimes.Add("Friday" & "-" & lstTimes(row))
 
                Case 6
                    lstOnTimes.Add("Saturday" & "-" & lstTimes(row))
 
                Case 7
                    lstOnTimes.Add("Sunday" & "-" & lstTimes(row))
            End Select
        Next
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: Franki
Datum: 27.05.17 03:29

Hallo,

was bedeuten denn die Zeiten bzw. die Intervalle von 30 Minuten?
Oder anders gefragt warum ist: Die aktuelle Zeit – 19.08 = False?

Das liegt doch im Intervall zwischen 18:00 und 20:00 Uhr.
Begrenzt deine Leerzeile verschiedene Pausen in den Intervallen?
Wenn ja, warum hast du dann die 30 Minuten Schritte drin, du prüfst ja nur ob die Zeit (mit Tag) irgendwo darein passt, aber nicht wo genau.

Monday-20:00
Monday-20:30
Monday-21:00
Monday-21:30

könntest du ersetzten durch

Monday-20:00
Monday-21:30

und da würde Die aktuelle Zeit – 20.40 = True
immer noch stimmen.

Erkläre doch mal etwas genauer, wie diese Zeiten bzw. Intervalle zustande kommen und was sie bedeuten.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: henrikl2000
Datum: 28.05.17 07:39

Hallo Frank,

Danke für deine Antwort.

Ich bin dabei ein Programm zu machen der Video bei Bewegung vor der Kamera aufnehmt.
Da habe ich mir gedacht das das Programm nur auf Bewegung vor der Kamera reagieren soll in bestimmte Zeitraume (frei definierbar).
Ich habe dafür ein DataGridView in dem die Zeiträume gewähnt werden kann.
Die geklickten Zellen bedeutet an und die nicht geklickte aus. An bedeutet reagier auf Bewegung.
Jeder Zelle bedeutet 30 Minuten.
Erster Kolonne die Zeiträume (kann nicht gewählt werden)
Kolonne 2 bis 8 die Tage (Montag bis Sontag)

Nun wenn der Benutzer für beispielsweise Montag ein Zeitraum von 10.00 bis 12.00 und ein von 16.00 bis 21.00 Soll das Programm auf Bewegung von 10 Uhr bis 12 Uhr und wieder von 16 Uhr bis 21 Uhr reagieren.

Mein Problem ist wie kriege ich mein Programm zu checken ob die aktuelle Zeit innerhalb eins der im DataGridView gewählten Zeiträume ist.

Vielleicht ist das gar nicht die richtige Lösung mit ein DataGridView (schaut aber gut aus). Ich bin offen für andere Lösungen.

Ich hoffe du verstehst was ich meine.

Gruß
Henrik
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: Manfred X
Datum: 28.05.17 10:09

Hallo!

So etwa????
Public Class frmCheckDateTime
 
    'Für die Auswahl der Zeitintervalle
    Dim dt As New DataTable
    Dim bs As New BindingSource
    Dim dgv As New DataGridView With _
        {.Parent = Me, .DataSource = bs, .Width = 300, .ReadOnly = true}
 
    'Controls für Eingabe des zu prüfenden Zeitpunktes
    Dim datepicker As New DateTimePicker With _
      {.Parent = Me, .Left = 320, .Width = 100, _
       .Format = DateTimePickerFormat.Short}
 
    Dim timepicker As New DateTimePicker With _
        {.Parent = Me, .Left = 430, .Width = 100, _
         .Format = DateTimePickerFormat.Time, .ShowUpDown = True}
 
    'Für die Prüfung des Zeitpunktes
    Dim WithEvents btnCheck As New Button With _
        {.Parent = Me, .Left = 320, .Width = 100, .Top = 100, .Text = "Check"}
 
 
    Private Sub frmCheckDateTime_Load(sender As System.Object, _
        e As System.EventArgs) Handles MyBase.Load
 
        Me.Width = 550
        Me.Height = 500
 
        'Liste der wählbaren Zeitintervalle in die Datatable eintragen
        dt.Columns.Add("Weekday", GetType(String))
        dt.Columns.Add("StartTime", GetType(String))
 
        Dim wd As String = GetWeekday(Now)
        For i As Integer = 1 To 7
            Dim wdn As String = _
                DateAndTime.WeekdayName(i, False, FirstDayOfWeek.Monday)
            For hr As Integer = 0 To 23
                dt.Rows.Add(wdn, hr.ToString & ":00")
                dt.Rows.Add(wdn, hr.ToString & ":30")
            Next hr
        Next i
 
        bs.DataSource = dt
    End Sub
 
 
    Private Function GetWeekday(ByVal dtim As DateTime) As String
        Return dtim.ToString("dddd", Globalization.CultureInfo.CurrentCulture)
    End Function
 
 
    Private Function IsIntime(ByVal r As DataRow, dtim As DateTime) As Boolean
 
        'Liegt dtim im Zeitintervall, das in r eingetragen ist ??
        Dim wdn As String = GetWeekday(dtim)
        If Not wdn = r("Weekday").ToString Then Return False
 
        Dim rhour As Integer = CInt(r("StartTime").ToString.Split(":"c)(0))
        Dim rmin As Integer = CInt(r("StartTime").ToString.Split(":"c)(1))
 
        If Not dtim.Hour = rhour Then Return False
        If dtim.Minute < 30 AndAlso rmin = 30 Then Return False
        If dtim.Minute >= 30 AndAlso rmin = 0 Then Return False
        Return True
    End Function
 
 
    Private Function CheckDateTime(ByVal dtim As DateTime) As Boolean
 
        For i As Integer = 0 To bs.Count - 1
            If dgv.Rows(i).Selected Then
                'Ein gewähltes Zeitintervall checken
                If IsIntime(DirectCast(bs(i), DataRowView).Row, dtim) _
                   Then Return True
            End If
        Next i
        Return False
    End Function
 
 
    Private Sub btnCheck_Click(sender As Object, _
        e As System.EventArgs) Handles btnCheck.Click
 
        'Gewähltes Datum und und gewählte Uhrzeit zusammenfügen
        Dim dtim As DateTime = datepicker.Value.Date
        dtim = dtim.AddHours(timepicker.Value.Hour)
        dtim = dtim.AddMinutes(timepicker.Value.Minute)
 
        If CheckDateTime(dtim) Then
            MsgBox("Zeitpunkt liegt in einem gewählten Intervall")
        Else
            MsgBox("Zeitpunkt liegt nicht in einem gewählten Intervall")
        End If
    End Sub
End Class
Füe die komfortable Auswahl der Intervalle, könntest Du eine zusätzliche
Boolsche Spalte in die Datatable einfügen.

Beitrag wurde zuletzt am 28.05.17 um 10:29:52 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zeit innerhalb die in der Liste angebende Zeiträume 
Autor: henrikl2000
Datum: 28.05.17 11:31

Hallo,

Vielen Dank für deinen Lösungsvorschlag.

Ja so etwas Ähnliches. Nur möchte die Tage horizontal (Kolonne 2 bis 8) und die Zeiten in Kolonne 1 vertikal und außerdem nur die Zellen statt die ganze reihe anklicken.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Liegt ein Zeitpunkt innerhalb einer Liste von Zeiträumen ? 
Autor: Manfred X
Datum: 28.05.17 12:33

So eine Spaghetti-Taktik nervt!!
Public Class frmCheckDateTime2
 
 
    'Für die Auswahl der Zeitintervalle
    Dim dt As New DataTable
    Dim bs As New BindingSource
    Dim WithEvents dgv As New DataGridView With _
        {.Parent = Me, .DataSource = bs, .Width = 700, .Height = 300, .ReadOnly _
        = True}
 
    Dim WithEvents btncheck As New Button With _
        {.Parent = Me, .Top = 350, .Text = "check"}
 
 
    Private Sub frmCheckDateTime2_Load(sender As System.Object, _
        e As System.EventArgs) Handles MyBase.Load
 
        Me.Width = 720
        Me.Height = 400
 
        dt.Columns.Add("StartTime", GetType(String))
 
        For i As Integer = 1 To 7
            Dim wdn As String = _
                DateAndTime.WeekdayName(i, False, FirstDayOfWeek.Monday)
            dt.Columns.Add(wdn)
        Next i
        For hr As Integer = 0 To 23
            dt.Rows.Add(hr.ToString & ":00")
            dt.Rows.Add(hr.ToString & ":30")
        Next hr
 
        bs.DataSource = dt
 
        dgv.MultiSelect = True
        dgv.SelectionMode = DataGridViewSelectionMode.CellSelect
 
        Using g As Graphics = dgv.CreateGraphics
            For i As Integer = 0 To dgv.Columns.Count - 1
                With dgv.Columns(i)
                    Dim sz As SizeF = g.MeasureString(.HeaderText, dgv.Font)
                    .Width = CInt(sz.Width * 1.1)
                    .DefaultCellStyle.SelectionBackColor = Color.Yellow
                    .SortMode = DataGridViewColumnSortMode.NotSortable
                End With
            Next i
         End Using
 
         With dgv.Columns(0).DefaultCellStyle
            .SelectionBackColor = .BackColor
         End With
    End Sub
 
 
    Private Function GetWeekday(ByVal dtim As DateTime) As String
        Return dtim.ToString("dddd", Globalization.CultureInfo.CurrentCulture)
    End Function
 
 
    Private Function CheckTime(ByVal dtim As DateTime) As Boolean
 
        Dim weekday As String = GetWeekday(dtim)
        Dim colindex As Integer = dt.Columns.IndexOf(weekday)
 
        For i As Integer = 0 To dgv.Rows.Count - 1
            If dgv.Rows(i).Cells(colindex).Selected Then
                Dim parts() As String = _
                   dgv.Rows(i).Cells(0).Value.ToString.Split(":"c)
                If CInt(parts(0)) = dtim.Hour Then
                    If CInt(parts(1)) = 0 And dtim.Minute < 30 Then Return True
                    If CInt(parts(1)) = 30 And dtim.Minute >= 30 Then Return True
                End If
            End If
        Next i
        Return False
    End Function
 
 
    Private Sub btncheck_Click(sender As Object, _
        e As System.EventArgs) Handles btncheck.Click
 
        If CheckTime(Now) Then
            MsgBox("Im Intervall")
        End If
    End Sub
End Class


Beitrag wurde zuletzt am 28.05.17 um 12:43:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liegt ein Zeitpunkt innerhalb einer Liste von Zeiträumen ? 
Autor: henrikl2000
Datum: 28.05.17 16:12

Vielen Dank.

Das ist genau was gesucht habe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel