时间经过午夜时的日期时间范围问题

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