| |
VB.NET - FortgeschritteneZeit 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 | |
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". | |
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 | |
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 | |
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 | |
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. | |
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. | |
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. | |
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. | |
| 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 |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|