カスタマイズされた形式で 2 つの日付の差を返す汎用関数をコーディングしようとしていますが、ある人から、たとえばこの 2 つの日付の差を取得しようとすると、私のスニペットにエラーがあると報告されました。
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
アップデート:
私はこのようにしようとしていますが、どうやって週を差し引くのですか?
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 = 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
更新 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