时间经过午夜时的日期时间范围问题
DateTime range issue when time passes midnight
我正在申请工作,但我刚刚 运行 碰壁了。
我们有 3 个班次,06:00-13:36、13:36-23:00 和 23:00-06:00。
我有两个标签,一个显示班次开始时间,另一个使用以下代码显示班次结束时间:
Dim StartTimeN As Date = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01"
Dim EndTimeN As Date = DateTime.Now.ToShortDateString & " 06:00"
Dim StartTimeF As Date = DateTime.Now.ToShortDateString & " 06:01"
Dim EndTimeF As Date = DateTime.Now.ToShortDateString & " 13:36"
Dim StartTimeE As Date = DateTime.Now.ToShortDateString & " 13:37"
Dim EndTimeE As Date = DateTime.Now.ToShortDateString & " 23:00"
Dim CurrentTime As Date = DateTime.Now
If (CurrentTime.Ticks >= StartTimeN.Ticks And CurrentTime.Ticks <= EndTimeN.Ticks) Then
Label1.Text = "23:00"
Label2.Text = "06:00"
ElseIf (CurrentTime.Ticks >= StartTimeF.Ticks And CurrentTime.Ticks <= EndTimeF.Ticks) Then
Label1.Text = "06:00"
Label2.Text = "13:36"
ElseIf (CurrentTime.Ticks >= StartTimeE.Ticks And CurrentTime.Ticks <= EndTimeE.Ticks) Then
Label1.Text = "13:36"
Label2.Text = "23:00"
End If
代码工作正常,夜班除外。我不能在 23-00 之间设置 adddays(-1),因为这会扰乱 SQL 的数据收集。
我有一个图表,收集 shiftours 之间的 sql 数据(例如 06:00-13:36 等)。
这会在 23:00 和 23:59 之间的小时内产生问题,因为 AddDays(-1) 从前一天收集数据。 Sql select SUM 查询在 DateTime.Now.ToShortDateString & " label1data(shiftstart)" 和 DateTime.Now
之间使用
我不确定如何解决 23 点到 00 点之间的问题。我是否需要为该小时创建一个 IF 语句以及一个特定的 SQL 函数,然后将来自 23:00-00:00 和 00:00-06:00 或者有更简单的方法吗?
我是初学者,如果答案很简单,我很抱歉,但这个问题几乎让我放弃了这个应用程序,因为我无法让它正常工作。
其他也基于 shifthours 的函数正在计算 shiftstart 和 DateTime.Now 之间的 TimeSpan,以便获得到目前为止轮班期间已经过去的小时数。然后将其乘以每小时 maxproducts,以显示如果 运行 以最大容量可以生产多少产品。整个应用程序是建立在为操作员显示有关他们轮班期间的生产信息的基础上的。
感谢您的帮助。
是的,您需要使用一个条件来确定使用什么时间,具体取决于时间:
Dim StartTimeN As Date
Dim EndTimeN As Date
If (DateTime.Now.Hour = 23) Then
StartTimeN = DateTime.Now.ToShortDateString & " 23:01"
EndTimeN = DateTime.Now.AddDays(1).ToShortDateString & " 06:00"
Else
StartTimeN = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01"
EndTimeN = DateTime.Now.ToShortDateString & " 06:00"
End
你的问题是夜班跨两天,所以你不能用同样的方式检查。
这是适合您的解决方案。它可能看起来很复杂,但它是一种改进的结构,并且更容易维护。我使用了时间跨度而不是日期,因为我认为这更适合这个解决方案,因为您不必担心日期部分
''' <summary>
''' A simple class to hold a shift start and end times
''' </summary>
Public Class Shift
Public Property StartTime As TimeSpan
Public Property EndTime As TimeSpan
Public ReadOnly Property IsnightShift As Boolean
Get
Return EndTime < StartTime
End Get
End Property
Public Sub New(startTime As TimeSpan, endTime As TimeSpan)
Me.StartTime = startTime
Me.EndTime = endTime
End Sub
End Class
然后是从班次列表中查找班次的函数:
''' <summary>
''' Finds the shift for a given time
''' </summary>
''' <param name="shifts"></param>
''' <param name="timeNow"></param>
''' <returns></returns>
Public Function FindShiftStartAndEndTimes(shifts As List(Of Shift), timeNow As TimeSpan) As Shift
Dim endOfDayTime As New TimeSpan(24, 0, 0)
Dim startOfDay As New TimeSpan(0, 0, 0)
For Each shift In shifts
'nigh shift is a special case so check we are after the start time and before midnight OR after midnight on the next day and before the end of shift
If shift.IsnightShift Then
If (timeNow >= shift.StartTime AndAlso timeNow < endOfDayTime) OrElse
(timeNow >= startOfDay AndAlso timeNow < shift.EndTime) Then
Return shift
End If
Else
If timeNow >= shift.StartTime AndAlso timeNow < shift.EndTime Then
Return shift
End If
End If
Next
Throw New Exception("Could not find a shift for that time")
End Function
然后你可以这样找到当前班次:
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
'create a list of shifts
Dim shifts As New List(Of Shift)
'add your shifts to the list
shifts.Add(New Shift(New TimeSpan(6, 0, 0), New TimeSpan(13, 36, 0)))
shifts.Add(New Shift(New TimeSpan(13, 36, 0), New TimeSpan(23, 0, 0)))
shifts.Add(New Shift(New TimeSpan(23, 0, 0), New TimeSpan(6, 0, 0)))
'find the current shift
Dim shift = FindShiftStartAndEndTimes(shifts, New TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second))
MessageBox.Show("Current Shift is " & shift.StartTime.ToString & "-" & shift.EndTime.ToString)
End Sub
我正在申请工作,但我刚刚 运行 碰壁了。
我们有 3 个班次,06:00-13:36、13:36-23:00 和 23:00-06:00。 我有两个标签,一个显示班次开始时间,另一个使用以下代码显示班次结束时间:
Dim StartTimeN As Date = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01"
Dim EndTimeN As Date = DateTime.Now.ToShortDateString & " 06:00"
Dim StartTimeF As Date = DateTime.Now.ToShortDateString & " 06:01"
Dim EndTimeF As Date = DateTime.Now.ToShortDateString & " 13:36"
Dim StartTimeE As Date = DateTime.Now.ToShortDateString & " 13:37"
Dim EndTimeE As Date = DateTime.Now.ToShortDateString & " 23:00"
Dim CurrentTime As Date = DateTime.Now
If (CurrentTime.Ticks >= StartTimeN.Ticks And CurrentTime.Ticks <= EndTimeN.Ticks) Then
Label1.Text = "23:00"
Label2.Text = "06:00"
ElseIf (CurrentTime.Ticks >= StartTimeF.Ticks And CurrentTime.Ticks <= EndTimeF.Ticks) Then
Label1.Text = "06:00"
Label2.Text = "13:36"
ElseIf (CurrentTime.Ticks >= StartTimeE.Ticks And CurrentTime.Ticks <= EndTimeE.Ticks) Then
Label1.Text = "13:36"
Label2.Text = "23:00"
End If
代码工作正常,夜班除外。我不能在 23-00 之间设置 adddays(-1),因为这会扰乱 SQL 的数据收集。 我有一个图表,收集 shiftours 之间的 sql 数据(例如 06:00-13:36 等)。 这会在 23:00 和 23:59 之间的小时内产生问题,因为 AddDays(-1) 从前一天收集数据。 Sql select SUM 查询在 DateTime.Now.ToShortDateString & " label1data(shiftstart)" 和 DateTime.Now
之间使用我不确定如何解决 23 点到 00 点之间的问题。我是否需要为该小时创建一个 IF 语句以及一个特定的 SQL 函数,然后将来自 23:00-00:00 和 00:00-06:00 或者有更简单的方法吗?
我是初学者,如果答案很简单,我很抱歉,但这个问题几乎让我放弃了这个应用程序,因为我无法让它正常工作。
其他也基于 shifthours 的函数正在计算 shiftstart 和 DateTime.Now 之间的 TimeSpan,以便获得到目前为止轮班期间已经过去的小时数。然后将其乘以每小时 maxproducts,以显示如果 运行 以最大容量可以生产多少产品。整个应用程序是建立在为操作员显示有关他们轮班期间的生产信息的基础上的。
感谢您的帮助。
是的,您需要使用一个条件来确定使用什么时间,具体取决于时间:
Dim StartTimeN As Date
Dim EndTimeN As Date
If (DateTime.Now.Hour = 23) Then
StartTimeN = DateTime.Now.ToShortDateString & " 23:01"
EndTimeN = DateTime.Now.AddDays(1).ToShortDateString & " 06:00"
Else
StartTimeN = DateTime.Now.AddDays(-1).ToShortDateString & " 23:01"
EndTimeN = DateTime.Now.ToShortDateString & " 06:00"
End
你的问题是夜班跨两天,所以你不能用同样的方式检查。
这是适合您的解决方案。它可能看起来很复杂,但它是一种改进的结构,并且更容易维护。我使用了时间跨度而不是日期,因为我认为这更适合这个解决方案,因为您不必担心日期部分
''' <summary>
''' A simple class to hold a shift start and end times
''' </summary>
Public Class Shift
Public Property StartTime As TimeSpan
Public Property EndTime As TimeSpan
Public ReadOnly Property IsnightShift As Boolean
Get
Return EndTime < StartTime
End Get
End Property
Public Sub New(startTime As TimeSpan, endTime As TimeSpan)
Me.StartTime = startTime
Me.EndTime = endTime
End Sub
End Class
然后是从班次列表中查找班次的函数:
''' <summary>
''' Finds the shift for a given time
''' </summary>
''' <param name="shifts"></param>
''' <param name="timeNow"></param>
''' <returns></returns>
Public Function FindShiftStartAndEndTimes(shifts As List(Of Shift), timeNow As TimeSpan) As Shift
Dim endOfDayTime As New TimeSpan(24, 0, 0)
Dim startOfDay As New TimeSpan(0, 0, 0)
For Each shift In shifts
'nigh shift is a special case so check we are after the start time and before midnight OR after midnight on the next day and before the end of shift
If shift.IsnightShift Then
If (timeNow >= shift.StartTime AndAlso timeNow < endOfDayTime) OrElse
(timeNow >= startOfDay AndAlso timeNow < shift.EndTime) Then
Return shift
End If
Else
If timeNow >= shift.StartTime AndAlso timeNow < shift.EndTime Then
Return shift
End If
End If
Next
Throw New Exception("Could not find a shift for that time")
End Function
然后你可以这样找到当前班次:
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
'create a list of shifts
Dim shifts As New List(Of Shift)
'add your shifts to the list
shifts.Add(New Shift(New TimeSpan(6, 0, 0), New TimeSpan(13, 36, 0)))
shifts.Add(New Shift(New TimeSpan(13, 36, 0), New TimeSpan(23, 0, 0)))
shifts.Add(New Shift(New TimeSpan(23, 0, 0), New TimeSpan(6, 0, 0)))
'find the current shift
Dim shift = FindShiftStartAndEndTimes(shifts, New TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second))
MessageBox.Show("Current Shift is " & shift.StartTime.ToString & "-" & shift.EndTime.ToString)
End Sub