| |
VB.NET - Ein- und UmsteigerHeute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 06.10.23 10:51 |
| Hallo ich möchte die aktuelle bzw. eingegebene Zeit 07:00 Uhr 1 h in schleife hinzufügen die letzte Zeit wäre dann bspw. 18:00 wie stellt man das an
h soll eine Variable sein, also auch 1,5 h zum Beispiel
ich glaube mit AddHours(1) oder so, nur mein Problem ist die Schleife dafür und doppelte Einträge sollen es ja auch nicht sein dürfen
in einer Spalte einer DGV soll dann das stehen
07:00
08:00
09:00
10:00
11:00
.
.
.
18:00
Danke | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 06.10.23 12:41 |
| hab da was gefunden, aber gefällt mir noch nicht ganz
evtl. hat jemand was schöneres möchte ja auch 1,5 h oder 2,5 h
Dim currentDate As DateTime = Me.timepicker.Value
Dim endDate As DateTime = currentDate.AddHours(9)
Dim hCount As Integer = CInt(DateDiff(DateInterval.Hour, currentDate, _
endDate))
For i = 0 To hCount
DataGridView1.Rows.Add(hCount, currentDate.AddHours(i).ToString( _
"dd.MM.yyyy HH:mm"))
Next aussehen tut es dann so
für eine schönere (bessere) Lösung Danke | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: SoEinVBler | Datum: 08.10.23 13:07 |
| Hallo,
die einfachste Lösung wäre vermutlich einfach die Schrittgröße (Steps) in deiner Schleife anzugeben.
Du solltest die Variable i dann auch als Double deklarieren um auch Dezimalzahlen verwenden zu können
Mein Beispiel ist mit Messagebox, da ich das Grid nicht einrichten wollte.
Dim currentDate As DateTime = DateTime.Now
Dim i As Double
Dim delta As Double = 1.5
Dim hCount As Integer = 5 'CInt(DateDiff(DateInterval.Hour,
' currentDate, endDate))
For i = 0 To hCount Step delta
MessageBox.Show(currentDate.AddHours(i).ToString("dd.MM.yyyy" & _
"HH:mm"))
Next | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 08.10.23 15:18 |
| Danke sieht soweit gut aus
wie kann man nun prüfen das er nicht über 24:00 rausgeht
also immer nur von Bspweise Heute 07:00 bis 22:00
if Now = ??
hier noch der Code:
Dim dt As DataTable = DataSet1.Details
'##########
Dim currentDate As DateTime = timepicker.Value 'DateTime.Now
Dim i As Double
Dim delta As Double = 1.5
Dim hCount As Integer = 10 'CInt(DateDiff(DateInterval.Hour,
' currentDate, endDate))
For i = 0 To hCount Step delta
Dim NewRow As DataRow = dt.NewRow
NewRow("Tagesdatum") = currentDate.AddHours(i).ToString("dd.MM.yyyy" & _
"HH:mm")
NewRow("Kommentar") = "das funzt-------"
dt.Rows.Add(NewRow)
Next
DetailsDataGridView.Refresh() | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: SoEinVBler | Datum: 09.10.23 09:06 |
| Hallo,
das Ende der Schleife oder die Dauer der Schleife legst du ja mit hCount fest.
Das hast du ja in deinem 1. Beispiel auch schon berechnet.
Um mit Zeiten zu arbeiten gibt es 2 Datentypen DateTime & TimeSpan.
In DateTime wird ein Datum und Uhzeit gespeichert, TimeSpan ist eine Zeitspanne, also eine "Differenz".
Beide Typen bieten einige Funktionen und Eigenschaften, schau sie dir mal an.
So was geht z.B. auch.
Dim d As DateTime = DateTime.Now
Dim td As TimeSpan = TimeSpan.FromHours(1.5)
MessageBox.Show(d.ToShortTimeString)
d = d.Add(td)
MessageBox.Show(d.ToShortTimeString) | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 09.10.23 12:50 |
| Danke für deine Mühe doch ich möchte das Datum Uhrzeit nicht doppelt haben
wie kann ich das in der Schleife prüfen? | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: SoEinVBler | Datum: 09.10.23 20:54 |
| Hallo,
naja du must dann halt die Inhalte des Datagrid durchgehen und prüfen ob es schon vorhandne ist.
Oder du packst die Werte in eine List und prüfst ob die Werte enthalten sind.
in der 2. Schleife wird nur der letze Wert eingetragen, die anderen existieren ja schon.
Dim currentDate As DateTime = DateTime.Now
Dim lDate As New List(Of DateTime)
Dim i As Double
Dim delta As Double = 1.5
Dim hCount As Integer = 5
For i = 0 To hCount Step delta
If lDate.Exists(Function(x) x = currentDate.AddHours(i)) = False _
Then
lDate.Add(currentDate.AddHours(i))
MessageBox.Show(lDate.Item(lDate.Count - 1).ToString( _
"dd.MM.yyyy HH:mm"))
End If
Next
For i = 0 To hCount + 2 Step delta
If lDate.Exists(Function(x) x = currentDate.AddHours(i)) = False _
Then
lDate.Add(currentDate.AddHours(i))
MessageBox.Show(lDate.Item(lDate.Count - 1).ToString( _
"dd.MM.yyyy HH:mm"))
End If
Next | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 10.10.23 14:36 |
| leider bekomme ich das nicht in die Datenbank bzw. Datarow, arbeite dran | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 12.10.23 18:02 |
| also weiß jetzt nicht ob das die Lösung ist, scheint aber zu funktionieren. Möchte aber sicher sein
darum was meint das Forum dazu?
Dim dt As DataTable = DataSet1.Details1
'##########
Dim currentDate As DateTime = StartDate
Dim currentEnde As DateTime = EndDate
Dim delta As Double = nuddelta.Value
Dim hCount As Integer = nudhcount.Value
For i = 0 To hCount Step delta
'prüfen
'Pruefe Vorhandensein der Uhrzeit:
Dim strPruefstring = currentDate.AddHours(i).ToString("HH:mm")
If pruefe_Uhrzeit(strPruefstring) = False Then
Fehler_Uhrzeit(strPruefstring)
Else
Dim NewRow As DataRow = dt.NewRow
NewRow("Tagesdatum") = currentDate.ToString("dd.MM.yyyy HH:mm")
NewRow("Uhrzeit") = currentDate.AddHours(i).ToString("HH:mm")
NewRow("Kommentar") = ">"
dt.Rows.Add(NewRow)
End If
Next 'Prüfung
Private Function pruefe_Uhrzeit(ByVal strPruefstring As String) As Boolean
Dim Anz = (From Eintrag In DataSet1.Details1
Where Eintrag.RowState <> DataRowState.Deleted AndAlso _
Eintrag.Uhrzeit.ToShortTimeString = strPruefstring.ToString
Select Eintrag).Count
If Anz > 0 Then Return False
Return True
End Function | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Manfred X | Datum: 13.10.23 10:49 |
| Hallo!
Einige Hinweise:
In einer Datatable sollte man grundätzlich Datum/Uhrzeit als Date-Spalten verwenden.
Auch für interne Abfragen und Überprüfungen immer auf die entsprechenden Methoden
der entsprechenden Klassen zurückgreifen.
String-Umwandlungen sind nur für die Anzeige oder Benutzer-Auswahl in einem Control
vorgesehen.
Beim Vergleich von Zeiten ist die benötigte Genauigkeit zu beachten.
Man bildet z.B. die Zeit-Differenz in einem Timespan-Objekt und vergleicht sie
mit einem Referenz-Timespan, das die maximal zulässige Abweichung vorgibt.
Auch in einer Schleife sollte Delta nicht als Double-Variable gesetzt werden.
Die Laufschleife könnte die Addseconds-Methode nutzen.
Statt 1,5 Minuten könnte man 90 Sekunden addieren. | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 13.10.23 11:38 |
| Hallo ManfredX
Danke für die Hinweise,
Die Laufschleife könnte die Addseconds-Methode nutzen.
kannst du uns ein besseres Beispiel basteln als meine Variante?
das wäre Top ich habe mit solchen Schleifen schon öfters Probleme in der Umsetzung gehabt (nicht verstanden).
ich möchte mir solche "Listen" erstellen können um die dann für verschiedenes zu verwenden. | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Manfred X | Datum: 13.10.23 13:39 |
| Hallo!
Ich habe zwar nicht so ganz verstanden, was Du erreichen möchstest,
aber die Bearbeitung von Zeitangaben wird verständlicher, wenn man
davon ausgeht, dass es sich bei der Zeitachse um eine Tick-Skala handelt.
''' <summary>Ganze Stunde vor einem Zeitpunkt</summary>
''' <param name="dt">Zeitpunkt</param>
Private Function FullHourBefore(ByVal dt As Date) As Date
Return dt.Date.AddHours(dt.Hour)
End Function
''' <summary>Liegen zwei Zeitpunkte innerhalb eines
' Vergleichs-Intervalls</summary>
''' <param name="dt1">Erster Zeitpunkt</param>
''' <param name="dt2">Zweiter Zeitpunkt</param>
''' <param name="maxdiff">Intervall</param>
Private Function AreDateTimesEqual(ByVal dt1 As Date, ByVal dt2 As Date, _
maxdiff As TimeSpan) As Boolean
If maxdiff < TimeSpan.Zero Then
Throw New ArgumentException("Negative Schranke bei Zeitvergleich")
End If
Return New TimeSpan(Math.Abs(dt1.Ticks - dt2.Ticks)) <= maxdiff
End Function
''' <summary>Erstellung einer Serie von gleichabständigen Zeitpunkten</summary>
''' <param name="dtStart">Startzeitpunkt</param>
''' <param name="dtEnd">Endzeitpunkt</param>
''' <param name="diff">Zeitintervall</param>
Private Function GetTimeSeries(ByVal dtStart As Date, ByVal dtEnd As Date, _
diff As TimeSpan) As List(Of Date)
If diff <= TimeSpan.Zero Or
dtStart >= dtEnd Then
Throw New ArgumentException("Keine geeignete Parameterliste bei" & _
"Zeitreihen-Erstellung")
End If
If Math.Abs(dtStart.Ticks - dtEnd.Ticks) \ Math.Abs(diff.Ticks) > _
100 Then
Throw New ArgumentException("Parameter definieren zu viele" & _
"Zeitpunkte")
End If
Dim dt As Date = dtStart
Dim dtList As New List(Of Date)
dtList.Add(dtStart)
Do Until dtEnd.Ticks < dt.Ticks + diff.Ticks
dt = dt.Add(diff)
dtList.Add(dt)
Loop
Return dtList
End Function | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 14.10.23 16:11 |
| Hallo Manfred X,
da komm ich nicht mit klar, also ich möchte soetwas wie im Outlook Kalender eine Agenda, Zeitleiste oder wie man es nennt.
7:00
8:00
9:00
etc. | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 17.10.23 18:22 |
| Hallo Manfred X,
ist mir wichtig!
würdest du das auch so machen ? oder hast du eine andere Idee ?
Dim NL As String = Environment.NewLine
'--------------------------------------------------------------------
Dim FirstDate As Date = CDate(dtp_start_Datetime.Value)
Dim delta As Integer = CLng(nud_Sekunden.Value)
Dim mCount As Integer = CInt(nud_mCount.Value)
Dim Msg As String = Nothing
Dim Daten As DataTable = DataSet1.Details
For i = 1 To mCount
FirstDate = DateAdd(DateInterval.Second, delta, FirstDate)
If Daten.Select("Tagesuhrzeit = '" & FirstDate.ToString("dd.MM.yyyy" & _
"HH:mm") & "'").Count = 0 Then
' Neue DRV
Dim DR As DataRow = Daten.NewRow
DR.Item("day") = FirstDate.ToString("ddd")
DR.Item("Tagesdatum") = FirstDate.ToString("dd.MM.yyyy")
DR.Item("Tagesuhrzeit") = FirstDate.ToString("HH:mm")
DR.Item("Kommentar") = ">"
'Neue Zeile
Daten.Rows.Add(DR)
'Me.Validate()
'DetailsBindingSource.EndEdit()
'In Dataset speichern
Else
'abbrechen
DetailsBindingSource.CancelEdit()
End If
Next
Me.DetailsBindingSource.Sort = "Tagesuhrzeit Asc" | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Manfred X | Datum: 17.10.23 22:51 |
| Hallo!
Die Stringdarstellung von Zeitangaben ist z.B. von Culture-Einstellungen abhängig
und deshalb nur geeignet für die Benutzer-Interaktion, aber nicht für
interne Programmzwecke.
'Einige Benutzereingaben in Controls
Dim dtp As New DateTimePicker
dtp.Value = New DateTime(2023, 5, 10, 13, 12, 45)
Dim nudMinutes As New NumericUpDown
nudMinutes.Value = 90
Dim nudCount As New NumericUpDown
nudCount.Value = 15
'Umwandlung der Eingaben in die erforderlichen DateTime-Werte
Dim startdatetime As DateTime = FullHourBefore(dtp.Value) 'siehe oben
Dim interval As New TimeSpan(0, CInt(nudMinutes.Value), 0)
Dim enddatetime As DateTime =
startdatetime.AddMinutes(CInt(nudCount.Value) * interval.TotalMinutes)
'Erstellung der Zeitpunktliste (siehe oben)
Dim datetimelist As List(Of DateTime) =
GetTimeSeries(startdatetime, enddatetime, interval)
'Datentabelle
Dim dt As New DataTable
Dim dtColumnname As String = "Zeitpunkt"
dt.Columns.Add(dtColumnname, GetType(DateTime))
'Zwei Zeilen mit Zeitpunkten eintragen
Dim dr As DataRow, fs As String
dr = dt.NewRow
dr(dtColumnname) = datetimelist(5).AddSeconds(15)
dt.Rows.Add(dr)
dr = dt.NewRow
dr(dtColumnname) = datetimelist(10).AddSeconds(-25)
dt.Rows.Add(dr)
'Datenliste in Datatable übertragen unter Beachtung der
'bereits vorhandenen Zeitpunkte und
'einer Genauigkeit von +/- 30 Sekunden
For i As Integer = 0 To datetimelist.Count - 1
dr = dt.NewRow()
'Filterstring für Vergleich / Zeitangaben in Hochkommas
fs = dtColumnname & ">'" & datetimelist(i).AddSeconds(-30) &
"' And " & dtColumnname & "<'" & datetimelist(i).AddSeconds(+30) & "'"
If dt.Select(fs).Count = 0 Then
dr(dtColumnname) = datetimelist(i)
dt.Rows.Add(dr)
End If
Next i
'Für die getrennte Anzeige von Datum und Uhrzeit
'wird eine zweite Spalte (Expression) erstellt
dt.Columns.Add("Uhrzeit", GetType(DateTime), dtColumnname)
bs.DataSource = dt 'Bindingsource für Datenbindung Um die getrennte Anzeige von Datum und Uhrzeit im Datagrid zu ermöglichen,
verwendet man z.B. die Expressionspalte "Uhrzeit" im CellFormatting-Event
des Datagridview-Control.
Private Sub dgv_CellFormatting(sender As Object,
e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
If e.ColumnIndex = 0 Then
If Not IsDBNull(e.Value) Then
e.Value = CDate(e.Value).ToString("dd.MM.yyyy")
e.FormattingApplied = True
End If
ElseIf e.columnindex = 1 Then
If Not IsDBNull(e.Value) Then
e.Value = CDate(e.Value).ToString("hh:mm")
e.FormattingApplied = True
End If
End If
End Sub | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Erichbru | Datum: 18.10.23 10:49 |
| Hallo Manfred X,
Danke für deine Variante, und den Kommentaren dazu.
Habe es mal versucht in eine Form zu packen muss aber gestehen ganz verstanden habe ich deine Variante noch nicht.
hier das Resultat vom Code verstehe es noch nicht ganz was hätte sein sollen?
hätte es nicht bei 13:12 los gehen müssen ?
und die Liste geht über den 10.05 raus ? soll es so sein ?
oder muss noch sortiert werden
was bedeuten die Parameter? 1 mal (5) und (15) 1 mal (10) und (-25)
'Zwei Zeilen mit Zeitpunkten eintragen
Dim dr As DataRow, fs As String
dr = dt.NewRow
dr(dtColumnname) = datetimelist(5).AddSeconds(15)
dt.Rows.Add(dr)
dr = dt.NewRow
dr(dtColumnname) = datetimelist(10).AddSeconds(-25)
dt.Rows.Add(dr)
Beitrag wurde zuletzt am 18.10.23 um 11:03:12 editiert. | |
Re: Heute dd.MM.yyyy HH:ss + 1 Hours | | | Autor: Manfred X | Datum: 18.10.23 14:23 |
| Hallo!
Ich kenne Dein Programm nicht und liefere Demo-Beispiele.
Wenn Du nicht möchtest, dass der Startzeitpunkt eine ganze Stunde ist,
lasse einfach den Aufruf der Methode GetfullHourBefore weg.
Diese Funktion schneidet nämlich bei der Benutzereingabe Minuten und
Sekunden weg.
Der Endzeitpunkt ist berechnet aus der Startzeit, dem Interval (90 Minuten)
und der Anzahl der Intervalle ("GetTimeSeries").
Wenn Du einen anderen Endzeitpunkt möchtest, der also innerhalb des letzten
Intervalls liegt (!), dann gib diesen Zeitpunkt als Parameter der Routine an.
Die Routine hört dann ein Intervall früher auf.
In der zurückgegebenen Liste, kannst Du Deinen Zeitpunkt dann noch anhängen
(Add-Methode). Das letzte Zeitintervall ist dann eben kürzer.
datetimelist(10).addseconds(-25) bedeutet,
dass ich den zehnten Eintrag in der DateTimelist abfrage und von diesem Zeitpunkt
25 Sekunden abziehe.
Dieser Wert wird vorab in die Liste eingetragen und dient zur Demonstration
des später verwendeten Select-Kommandos.
Da der Wert datetimelist(10) sich um weniger als 30 Sekunden von diesem bereits
eingetragenen Wert unterscheidet, wird datetimelist(10) in der Schleife nicht in
die Datentabelle übertragen (Select liefert Count =1).
Um auf die übliche 24-stündige Zeitanzeige zu kommen, kann man die
Formatierungsroutine mit Standardformat t und Cultureinfo nutzen:
Private Sub dgv_CellFormatting(sender As Object,
e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
If e.ColumnIndex = 0 Then
If Not IsDBNull(e.Value) Then
e.Value = CDate(e.Value).ToString("dd.MM.yyyy")
e.FormattingApplied = True
End If
ElseIf e.columnindex = 1 Then
If Not IsDBNull(e.Value) Then
e.Value = CDate(e.Value).ToString("t",
System.Globalization.CultureInfo.GetCultureInfo("DE-de"))
e.FormattingApplied = True
End If
End If
End Sub | |
| 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 |
|
|
sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) 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
|