原來DateDiff不是我所想的那樣

VB.Net, DateDiff

需求: 計算2個日期差的年, 並依年做不同的事

原以為DateDiff + DateInterval.Year, 就可以交差了事

於是就寫了 DateDiff(DateInterval.Year, date1, date2)

測試後沒問題,上線後使用者回報有的case正常, 有的case異常

...於是就有了今天的這則帖子...

===== 我是分隔線 ====================================================

原來DateDiff, 只針對DateInterval做差異計算

DateInterval.Year, 則只會將2個日期的年拿出來做DateDiff

於是就發生了...2018/01/01 ~ 2018/08/01 ==>0

於是就發生了...2017/12/01 ~ 2018/08/01 ==>1

那用DateInterval.Month呢?

特別拿4年才遇到1次的閏年, 實測結果如下:

2016.02.15 ~ 2018.02.15 ==>預期2年, 結果2年

2016.02.29 ~ 2018.02.15 ==>預期1年, 結果2年

也就是說, DateDiff實則將2個日期的年月拿出來做計算

===== 我是分隔線 ====================================================

使用者需求是: 計算2個日期差的年, 並依年做不同的事

實際使用者的隱藏需求是: 滿1年才算1年, 未滿1年則不列入, 也就是要細到 [日] 這個項目

如: 2017/08/01 ~ 2018/08/01 滿1年

     2016/08/02 ~ 2018/08/01 滿1年, 未滿2年

===== 解決方法 ======================================================

1. 將2個日期的年取出

            Dim date1_yyyy As Integer = date1.Year
            Dim date2_yyyy As Integer = date2.Year

2. 將2個日期的月日取出

            Dim date1_mmdd As String = date1.ToString("MMdd")
            Dim date2_mmdd As String = date2.ToString("MMdd")

3.年份相減

            Dim year As Integer = date2_yyyy - date1_yyyy

4.若未滿1年, 則將年份再減1

            If date1_mmdd > date2_mmdd Then
                year -= 1
            End If

5.結束

===== 總結 ==========================================================

原以為DateDiff會將2個日期計算出差距後, 依照我們所要求的DateInterval.Year, Month回傳Year或Month

實則DateInterval是用來決定要運用的對象是Year, 還是Month

真是誤會大了...