2

カスタマイズされた形式で 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
4

4 に答える 4

1

最も簡単な方法は、最初に両方の日付を比較し、次にどちらの日付が大きいかに応じて (後で) DateDiff を実行することだと思います。このようにして、ネガを避けることができます。もう 1 つの方法は、DateDiff の結果の絶対値を取得することです。1 か月であれば、1 か月前か 1 か月後かは関係ありません。

于 2013-08-15T19:11:14.987 に答える
1

これは、月と週をプログラムで計算しTimeSpan、残りの部分に a を使用します。扱いにくい月の計算では、 のインテリジェントな動作が使用されますAddMonths

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
于 2013-08-15T19:54:13.373 に答える