您現在的位置是:首頁 > 垂釣

DateDiff的問題,到底出在哪裡?

  • 由 BtOfficer 發表于 垂釣
  • 2022-10-16
簡介所以,要想計算任意兩個日期隔了多少年季月,請先轉換為天小時秒都可以,然後再依據呼叫者自己對年季月的定義,進一步進行轉換

vb中lcase函式是什麼意思

DateDiff的問題,到底出在哪裡?

1、BtOfficer在《

VB/VBA/VBS內建函式系列之DateDiff

》《

VB/VBA/VBS內建函式系列之DateAdd函式

》中介紹了常用的日期函式,也對日期

時間相關

的概念進行了簡單的普及。但是,有熱心網友反饋說,

DateDiff函式在計算日期時存在明顯的錯誤。

2、日期型別說複雜也不是很複雜,說簡單呢,

曾經的千年蟲問題名震江湖

,不僅如此在2038/1/19 11:14:07後還有大量的系統會涉及到

2038問題

。但是,兩個範圍內的日期計算,若真存在明顯的錯漏,這麼多年過去了,

按理說早該發現了才對。

3、所以,BtOfficer第一時間是不信的。但是該網友給出了示例,就忍不住去看了下。

比如

DateDiff(”yyyy“,"2000-12-30","2001-1-1")=1

,這明顯才幾天,怎麼就得出1年的間隔了呢?再改成季度和月份,都是1,明顯和常識不符啊。前面還說,這些函式可以應用於財務壞賬的計提,這不說瞎話,坑害人麼。

4、但轉念一想,除了財務,誰會沒事計算兩個日期間隔了幾年、幾個季度、幾個月啊,直接用天數不更好麼?

年/季/月在曆法中都有固定的歸屬,這是地球繞太陽公轉,地球自轉的物理客觀決定的。(注意這裡開始繞了)

但是將類似於1月15日到2月15日定義為1月的,現實生活中仍然被大量使用。其實,

這種習慣並不嚴謹。一方面,他們都有1個潛臺詞,叫過了多少天才能冠以年、季、月的單位。另一方面,他們忽略了大小月和閏月,本身只是一個模糊的度量。

當然,曆法的年、季、月,也是不斷修正後,才能維持在一個客觀的迴圈中。

如果

將DateDiff計算的年、季、月的結果,視為經過了多少天的準確計量,這種理解本身就是不準確的,又何來準確呢?

5、

為何VB/VBA(也包括其他語言)的Date型別,都定義為Double型別,因為時間本身就自帶精度問題啊!沒有絕對準確的時間計量。

其實也不需要絕對的精確,誰會在意1秒裡的毫秒,毫秒裡的微妙,微妙裡的納秒。。。對於應用而言,不構成影響的,就是不重要的,其度量上的丟棄行為,就不會影響精度。

所以,

當時間計量,走出檯曆上的年季月固有的框框時,還要沿用這些單位的,請務必使用更小級別精度的單位來計量。

具體來說,

季參照公轉對氣候的影響,月參照了地月現象,但二者都是地球自轉的集合。

所以,

天數及以下單位,是一個既可連線常識,也可作為度量單位的存在。

這是因為這些單位被高頻使用,常識理解與度量之間的差異已被人廣泛接受,腦補一體。比如,前一秒與後一秒,前一小時與後一小時,昨天、今天、明天與昨天N點到今天N點已過去1天。

6、再回頭來看看DateDiff函式,這樣的計量單位是提供了的。那年/季/月,這樣跨常識理解的計量單位,自然不是拿來應對通常理解的,而是提供給財務等具有專業分期需求的。

所以,要想計算任意兩個日期隔了多少年/季/月,請先轉換為天/小時/秒都可以,然後再依據呼叫者自己對年/季/月的定義,進一步進行轉換。

不知各位對此曾有疑問的網友,看了此篇分析後,能否想明白了呢?歡迎各位留言VB/VBA使用過程中各種疑難雜症。

關注BtOfficer,更多精彩,靜等VB/VBA擴充套件執行時哦!

Top