我想知道VB.NET是否有一个功能可以告诉我两个不同时间跨度的共同时间。
例如,我有两个不同的时间跨度:1st Date : (2013-01-01 8:30 AM) - (2013-01-01 11:30PM)
2nd Date : (2013-01-01 10:00 PM) - (2013-01-02 6:00 AM)
VB.NET可以告诉我答案是1小时30分钟吗? (也许是十进制) 这是1小时30分钟,因为晚上10点到晚上11点30分是另一个时间段。
要点:
我只需要一个功能,它会告诉我在某个时间段内有多少小时是夜班的一部分。 (那是晚上10点到早上6点)。
答案 0 :(得分:2)
此功能可通过TimeSpan
类:
例如:
result = (dt2 - dt1).TotalHours
当你减去两个日期时,你会得到一个TimeSpan。 TimeSpan的TotalHours属性为您提供小时数或其中的一部分。
查看文档:{{3}}
答案 1 :(得分:1)
编辑: 对不起,我误解了你的问题。我认为这就是你要找的东西。
这是你的DateRange类:
Public Class DateRange
Public Property StartTime As DateTime
Public Property EndTime As DateTime
Public ReadOnly Property NumberOfHours As Decimal
Get
Dim result As Double
result += (EndTime - StartTime).Hours
result += (EndTime - StartTime).Minutes / 60
result += (EndTime - StartTime).Seconds / 3600
Return result
End Get
End Property
End Class
这将是链接中的C#函数,用VB重写:
Private Function GetIntersectionRange(range1 As DateRange, range2 As DateRange) As DateRange
Dim iRange As New DateRange()
iRange.StartTime = If(range1.StartTime < range2.StartTime, range2.StartTime, range1.StartTime)
iRange.EndTime = If(range1.EndTime < range2.EndTime, range1.EndTime, range2.EndTime)
If iRange.StartTime > iRange.EndTime Then iRange = Nothing
Return iRange
End Function
以下是一小段代码,用于执行您提出的计算并将答案写入控制台:
Dim firstDate As New DateRange With {.StartTime = New DateTime(2013, 1, 1, 8, 30, 0), .EndTime = New DateTime(2013, 1, 1, 23, 30, 0)}
Dim secondDate As New DateRange With {.StartTime = New DateTime(2013, 1, 1, 22, 0, 0), .EndTime = New DateTime(2013, 1, 2, 6, 0, 0)}
Dim result As DateRange = GetIntersectionRange(firstDate, secondDate)
Console.WriteLine(result.NumberOfHours)
答案 2 :(得分:1)
Date1和Date2表示第一个时间跨度,Date2和Date3表示第二个时间跨度。如果更改日期的顺序,则必须为第一个if定义一个类似的else。
Dim date1 As Date = #1/1/2013 8:30:00 AM#
Dim date2 As Date = #1/1/2013 11:30:00 PM#
Dim date3 As Date = #1/1/2013 10:00:00 PM#
Dim date4 As Date = #1/2/2013 6:00:00 AM#
Dim timePeriod As TimeSpan
If date3.Date >= date1.Date And date3.Date <= date2.Date Then
If date4.Date <= date2.Date Then
timePeriod = date4.TimeOfDay - date3.TimeOfDay
Else
timePeriod = date2.TimeOfDay - date3.TimeOfDay
End If
End If
Msgbox(timePeriod.ToString)
EDIt:只需timePeriod = date4- date3
即可将差异转换为时间跨度
编辑2:即使没有共同的时间跨度,上面的代码也会返回date2-date3。在这种情况下,下面的代码将返回0。另外,在比较Date
语句中的两个If
变量时,TimeOfDay
部分会被忽略。
Dim date1 As Date = #1/1/2013 8:30:00 AM#
Dim date2 As Date = #1/1/2013 11:30:00 PM#
Dim date3 As Date = #1/1/2013 10:00:00 PM#
Dim date4 As Date = #1/2/2013 6:00:00 AM#
Dim timePeriod As TimeSpan
If date3 >= date1 And date3 <= date2 Then
If date4 <= date2 Then
timePeriod = date4 - date3
ElseIf date3 < date2 Then
timePeriod = date2 - date3
ElseIf date3.Date = date2.Date Then
If date3.TimeOfDay < date2.TimeOfDay Then
timePeriod = date2 - date3
Else
timePeriod = TimeSpan.FromDays(0)
End If
Else
timePeriod = TimeSpan.FromDays(0)
End If
End If
MsgBox(timePeriod.ToString)
答案 3 :(得分:0)
喜欢这个吗?
Dim d1 As DateTime = "1/22/2018 8:30:00 AM"
Dim d2 As DateTime = "1/29/2018 5:30:00 PM"
Dim ts As TimeSpan = d2.Subtract(d1)
MessageBox.Show("Total Hours are " & Convert.ToDouble(Math.Round(ts.TotalHours, 2)))
只是玩弄它