Я пытаюсь закодировать общую функцию, чтобы вернуть разницу между двумя датами в настраиваемом формате, но один человек сообщил мне, что у моего фрагмента есть ошибка, например, пытаясь получить разницу между это две даты:Функция для получения пользовательской разницы дат
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 [email protected]
'
' 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
UPDATE:
Я пытаюсь сделать это, как таким образом, но теперь, как вычтем недели?
Private Function DateDifference (ByVal Date1 Как DateTime, ByVal Дата2 Как DateTime) As String
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)
End Function
UPDATE 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
UPDATE 3:
Я больше рядом с его код, но, как я сказал, что я потерял вычислительные вещи:
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
For X As Short = CShort(Date1.Month) To CShort(Date2.Month)
MonthDiFF =
MsgBox(DayDiff - DateTime.DaysInMonth(Date1.Year, X))
'MsgBox(DateTime.DaysInMonth(Date1.Year, X))
Next
' MsgBox(DayDiff - 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
Почему вы изобретаете колесо здесь? 'return (date2-date1) .Tostring (formatString);' – asawyer
@asawyer, вы видели переменную WEEK? Я не могу получить недели со стандартными форматами DateTime, или, может быть, я ошибаюсь? – ElektroStudios
Отметьте этот ответ на аналогичный вопрос: http://stackoverflow.com/a/9216404/2250183 – AndASM