.net 函数获取自定义日期差
我试图编写一个通用函数,以自定义格式返回两个日期之间的差异,但有人告诉我,我的代码段有一个错误,例如,试图获取这两个日期之间的差异:.net 函数获取自定义日期差,.net,vb.net,date,datetime,datediff,.net,Vb.net,Date,Datetime,Datediff,我试图编写一个通用函数,以自定义格式返回两个日期之间的差异,但有人告诉我,我的代码段有一个错误,例如,试图获取这两个日期之间的差异: 15/08/2013 - 02/09/2013 我的函数返回负值,还有一个1个月的差值,因为09大于08,所以它不能像我需要的那样工作: 1 Months, -1 Weeks, -6 Days, 0 Hours, 0 Minutes and 0 Seconds 预期结果如下: 0 Months, 2 Weeks, 4 Days, 0 Hours, 0 Min
15/08/2013 - 02/09/2013
我的函数返回负值,还有一个1个月的差值,因为09大于08,所以它不能像我需要的那样工作:
1 Months, -1 Weeks, -6 Days, 0 Hours, 0 Minutes and 0 Seconds
预期结果如下:
0 Months, 2 Weeks, 4 Days, 0 Hours, 0 Minutes and 0 Seconds
有人能帮我在某些日期纠正这个错误吗
这是我的密码:
#Region " Date Difference "
' Date Difference
'
' // By Elektro H@cker
'
' Examples :
'
' MsgBox(DateDifference(DateTime.Parse("01/03/2013"), DateTime.Parse("10/04/2013"))) ' Result: 1 Months, 1 Weeks, 2 Days, 0 Hours, 0 Minutes and 0 Seconds
' MsgBox(DateDifference(DateTime.Parse("01/01/2013 14:00:00"), DateTime.Parse("02/01/2013 15:00:30"))) ' Result: 0 Months, 0 Weeks, 1 Days, 1 Hours, 0 Minutes and 30 Seconds
Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim MonthDiff As String, WeekDiff As String, _
DayDiff As String, HourDiff As String, _
MinuteDiff As String, SecondDiff As String
MonthDiff = Convert.ToString(DateDiff("M", Date1, Date2))
WeekDiff = Convert.ToString(DateDiff("d", Date1.AddMonths(DateDiff("M", Date1, Date2)), Date2) \ 7)
DayDiff = Convert.ToString(DateDiff("d", Date1.AddMonths(DateDiff("M", Date1, Date2)), Date2) - (WeekDiff * 7))
HourDiff = Convert.ToString(DateDiff("h", Date1.AddHours(DateDiff("h", Date1, Date2)), Date2) - (Date1.Hour - Date2.Hour))
MinuteDiff = Convert.ToString(DateDiff("n", Date1.AddMinutes(DateDiff("n", Date1, Date2)), Date2) - (Date1.Minute - Date2.Minute))
SecondDiff = Convert.ToString(DateDiff("s", Date1.AddSeconds(DateDiff("s", Date1, Date2)), Date2) - (Date1.Second - Date2.Second))
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
MonthDiff, WeekDiff, DayDiff, HourDiff, MinuteDiff, SecondDiff)
End Function
#End Region
更新:
我试着这样做,但现在如何减去周数
私有函数DateDifference(ByVal Date1作为DateTime,ByVal Date2作为DateTime)作为字符串
Dim MonthDiff As String, WeekDiff As String, _
DayDiff As String, HourDiff As String, _
MinuteDiff As String, SecondDiff As String
MonthDiff = Date2.Month - Date1.Month
' WeekDiff = Date2.Month - Date1.Month
DayDiff = Date2.Day - Date1.Day
HourDiff = Date2.Hour - Date1.Hour
MinuteDiff = Date2.Minute - Date1.Minute
SecondDiff = Date2.Second - Date1.Second
' MsgBox((Date2 - Date1).ToString("dd"))
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
MonthDiff, WeekDiff, DayDiff, HourDiff, MinuteDiff, SecondDiff)
端函数
更新2:
我试图用其他方法重写它以获得日期准确性,但我完全迷失了方向:
Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim DayDiff As Long = Date2.Subtract(Date1).Days
Dim HourDiff As Long = Date2.Subtract(Date1).Hours
Dim MinuteDiff As Long = Date2.Subtract(Date1).Minutes
Dim SecondDiff As Long = Date2.Subtract(Date1).Seconds
Dim MilliDiff As Long = Date2.Subtract(Date1).Milliseconds
Dim MonthDiFF As Long
Dim WeekDiFF As Long
Select Case (DayDiff Mod DateTime.DaysInMonth(Date1.Year, Date1.Month))
Case Is <= 0
MonthDiFF = 0
Case Is = 1, Is <= 28
MonthDiFF = 1
Case Is > 28
End Select
MsgBox(DayDiff Mod DateTime.DaysInMonth(Date1.Year, Date1.Month))
MsgBox(MonthDiFF)
' Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
' MonthDiff, WeekDiff, t.Days, t.Hours, t.Minutes, t.Seconds)
End Function
我认为最简单的方法是先比较两个日期,然后根据哪个日期更大(更晚)进行日期区分。这样你就可以避免负面影响。另一种方法是获取DateDiff结果的绝对值,因为只要是1个月,它就不重要了。我认为最简单的方法是先比较两个日期,然后根据哪个日期更大(更晚)进行DateDiff。这样你就可以避免负面影响。另一种方法是获取DateDiff结果的绝对值,因为它是一个月之前还是之后都不重要,只要它是一个月就可以了。为什么不呢 然后 还可以减去
TimeSpan
值:
DateTime date = DateTime.Now;
TimeSpan span = new TimeSpan(5, 12, 30, 0); // 5 Days, 12.5 hours
DateTime newDate = date.Subtract(span); // Subtract time span from date gives another date
请注意DateTime
和TimeSpan
之间的区别 为什么不呢
然后
还可以减去TimeSpan
值:
DateTime date = DateTime.Now;
TimeSpan span = new TimeSpan(5, 12, 30, 0); // 5 Days, 12.5 hours
DateTime newDate = date.Subtract(span); // Subtract time span from date gives another date
请注意
DateTime
和TimeSpan
之间的区别 这应该满足您的需要,对于大多数情况,TimeSpan
类给出了答案:
Public Shared Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim diff As TimeSpan = Date2 - Date1
Dim months = (Date2.Month - Date1.Month) + 12 * (Date2.Year - Date1.Year)
diff -= TimeSpan.FromDays(months * 30)
Dim weeks = Math.Floor(diff.Days / 7)
diff -= TimeSpan.FromDays(weeks * 7)
Dim dayDiff = (diff.Days Mod 7).ToString()
Dim hourDiff = diff.Hours.ToString()
Dim minDiff = diff.Minutes.ToString()
Dim secDiff = diff.Seconds.ToString()
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
months.ToString, weeks.ToString, dayDiff, hourDiff, minDiff, secDiff)
End Function
测试:
这应该满足您的需要,对于大多数情况,
TimeSpan
类给出了答案:
Public Shared Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim diff As TimeSpan = Date2 - Date1
Dim months = (Date2.Month - Date1.Month) + 12 * (Date2.Year - Date1.Year)
diff -= TimeSpan.FromDays(months * 30)
Dim weeks = Math.Floor(diff.Days / 7)
diff -= TimeSpan.FromDays(weeks * 7)
Dim dayDiff = (diff.Days Mod 7).ToString()
Dim hourDiff = diff.Hours.ToString()
Dim minDiff = diff.Minutes.ToString()
Dim secDiff = diff.Seconds.ToString()
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
months.ToString, weeks.ToString, dayDiff, hourDiff, minDiff, secDiff)
End Function
测试:
这将以编程方式计算月和周,然后对其余部分使用a。月份计算会很棘手,它使用了的智能行为
Private函数DateDifference(ByVal Date1作为DateTime,ByVal Date2作为DateTime)作为字符串
Dim MonthDiff=0
Date1以编程方式计算月和周,然后对其余部分使用a。月份计算会很棘手,它使用了的智能行为
Private函数DateDifference(ByVal Date1作为DateTime,ByVal Date2作为DateTime)作为字符串
Dim MonthDiff=0
你为什么要在这里重新发明轮子<代码>返回(date2-date1).Tostring(formatString)代码>@asawyer,你看到WEEK变量了吗?我无法用standars的DateTime格式获得数周的时间,或者可能我错了。看看这个类似问题的答案:你为什么要在这里重新发明轮子<代码>返回(date2-date1).Tostring(formatString)代码>@asawyer,你看到WEEK变量了吗?我无法使用Standards DateTime格式获得周数,或者可能我错了?。请查看类似问题的答案:感谢您的回答,但代码不适用于此日期:“16/08/2013 14:00:00”-“18/09/2013 15:02:05”,它返回此结果:“-1个月,5周,33天,1小时,2分5秒”@ElektroHacker:编辑了我的答案,在月份计算中有一个“turner”。它说在8月31日到9月1日之间有一个月零一天。月份中的天数不应该以周或天计算。不可能,使用这个日期“16/08/2013 14:00:00”-“28/08/2013 15:02:05”结果是:0个月,2周,12天,1小时,2分5秒期望的结果是什么?谢谢你的回答,但代码与日期不符:“16/08/2013 14:00:00”-“18/09/2013 15:02:05”,它返回结果:“-1个月,5周,33天,1小时,2分5秒”@ElektroHacker:编辑了我的答案,有一个“特纳”在月份计算中。它表示8月31日至9月1日之间有一个月零一天。月份中的天数不应以周或天计算。不可能,使用此日期“16/08/2013 14:00:00”-“28/08/2013 15:02:05”,结果是:0个月,2周,12天,1小时,2分5秒期望的结果是什么?谢谢,但它会返回此日期的负值:“16/02/2013 14:00:00”-“28/03/2013 15:02:05”@ElektroHacker我已更新了我的答案以修复此问题;我将代码从C#转换而来,没有注意到C#中的整数除法与VB.Net中的整数除法不同。非常感谢,但它没有日期准确性,例如在这些日期之间:“01/02/2013 14:00:00”-“01/03/2013 15:02:05”,结果是“1个月”,但2月有28天,因此结果实际上是“4周”。请看我的updates@ElektroHacker你认为2月1日、3月1日和4月1日后的1个月是什么?我预计3月1日、4月1日和5月1日。谷歌:1个月=30.4368499天,我们说“1个月”和“1个月”(满月)是不一样的。谢谢你,但它会为这个日期返回负值:“16/02/2013 14:00:00”-“28/03/2013 15:02:05”@ElektroHacker我已经更新了我的答案来解决这个问题;我将代码从C#转换而来,没有注意到C#中的整数除法与VB.Net中的整数除法不同。非常感谢,但它没有日期准确性,例如在这些日期之间:“01/02/2013 14:00:00”-“01/03/2013 15:02:05”,结果是“1个月”,但2月有28天,因此结果实际上是“4周”。请看我的updates@ElektroHacker你认为2月1日、3月1日和4月1日后的1个月是什么?我预计3月1日、4月1日和5月1日。老谷歌:1个月=30.4368499天,我们说“1个月”和“1个月”(满月)是不一样的。
Public Shared Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim diff As TimeSpan = Date2 - Date1
Dim months = (Date2.Month - Date1.Month) + 12 * (Date2.Year - Date1.Year)
diff -= TimeSpan.FromDays(months * 30)
Dim weeks = Math.Floor(diff.Days / 7)
diff -= TimeSpan.FromDays(weeks * 7)
Dim dayDiff = (diff.Days Mod 7).ToString()
Dim hourDiff = diff.Hours.ToString()
Dim minDiff = diff.Minutes.ToString()
Dim secDiff = diff.Seconds.ToString()
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
months.ToString, weeks.ToString, dayDiff, hourDiff, minDiff, secDiff)
End Function
Dim diffInfo = DateDifference(New Date(2013, 8, 16, 14, 0, 0), New Date(2013, 9, 28, 15, 2, 5))
Console.WriteLine(diffInfo) '1 Months, 1 Weeks, 6 Days, 1 Hours, 2 Minutes and 5 Seconds
Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
Dim MonthDiff = 0
While Date1 <= Date2
Date1 = Date1.AddMonths(1)
MonthDiff += 1
End While
MonthDiff -= 1
Date1 = Date1.AddMonths(-1)
Dim t As TimeSpan = Date2 - Date1
Dim WeekDiff As Integer = t.Days \ 7
t = t - TimeSpan.FromDays(WeekDiff * 7)
Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
MonthDiff, WeekDiff, t.Days, t.Hours, t.Minutes, t.Seconds)
End Function