
VB/VBA/VBS內置函數系列Dateadd等日期函數
VB/VBA/VBS內置函數系列

前言
在《VB/VBA/VBS內置函數有哪些?》從分類和具體名稱上介紹VB/VBA/VBS內置函數集。前篇《VB/VBA/VBS內置函數系列Datediff介紹了日期減法函數Datediff的語法、參數描述、功能和應用場景。既然有時間減法函數,自然也有時間加法函數,這就是本文要講的Dateadd函數。
為什么作者要從時間函數開始談論這些列函數?因為時間很重要!想想衛星、空間站、火星探測器上天的宇航活動,沒有可靠的時間嗎?相隔千里,只有時間才能成為同步的參考。盡管使用VB//VBA/VBS通常不需要原子鐘的精度,甚至很多人對時間的概念知之甚少,但如果我們試著了解時間,我們會發現:哇,原來的時間可以如此美妙。
1、電子文件防偽是一個非常有趣和商業價值的領域。你知道實現它的方法嗎?VB/VBA/VBS能實現性價比高的版本嗎?
2、商業價值必須依靠時間來衡量。投資回收期、投資回報率、銷售利率等都暗示著時間因素。商業活動的發展,都是在預與立中博弈,大如國家財政預算,小如企業收支預算。如何比較中外企業(如南亞國家)的業績?外資企業如何與外國股東溝通經營成果?如何評價中國企業在國外的投資經營?所有這些都離不開時間。
3、隨著互聯網的發展,這顆藍色的星球早已是地球村。拋開經貿金融交流,如何在社交娛樂中實現同步?疫情期間,各國元首的視頻會議如何保持有序?
4、為什么主要終端,如PC,在下次打開時關閉電源而不停止?Windows等通用操作系統,又稱分時多任務操作系統,是如何協調大家邊聽歌邊寫/看文檔的?VB/VBA/VBS需要計時器嗎?
雖然上述問題大多與本文無關,但時間仍然是一貫的線索,但時間太基本了,很多人理所當然。比如很多想賣錢的軟件,都要考慮試用期和訂閱期。筆者親眼看到了財經行業軟件(朋友)的早期版本,甚至以終端時間為控制依據。想必很多人都寫VB/VBA/VBS都這么做了。只能說,如果你對時間有一點了解,那一定是一種誤解!
因此,本文在介紹DateAdd函數的同時,簡要介紹了其他相關的時間函數和相關概念。在后期的專題應用中,結合具體的例子,詳細介紹高端!

一、常見的日期函數
VB提供了一系列與處理日期(時間)相關的內置函數,如年(Year)月(Month)日(Day)時(Hour)分(Minute)秒(Second)周(Week)當前時間(Now),當然,CDate\eDate\Time\Timer\Weekday等函數。這些函數幾乎包含了處理日期和時間的一般要求,也是常用的函數。但也有一些不常用的日期函數,作者簡要介紹如下:
1、時間分解函數
主要包括Date和Time函數,都是基于系統的當前時間,前者獲得日期,后者獲得時間。習慣上,我們把時間分為日期和時間兩部分,比如“2021-11-2217”:07:25“。看過《知VBA浮點數結構,更懂算力》的朋友(可以點擊查看)應該知道,Date類型其實是Double類型,日期部分是Double的整數部分,時間是Double的小數部分。
看完VB的整數,你真的知道嗎?》朋友們(可以點擊查看)應該知道,計算機中的浮點類型也是整數,也就是說Double類型的Date實際上是8字節整數。而VB/VBA/VBS是一種弱型語言,這意味著用戶可以在整數、日期和雙精度浮點之間以任何低成本轉換相同內存中的數據,而Date和Time函數可以允許整數和小數部分參與代數計算。
這不僅適用于許多巧妙的算法設計,而且性能也不低。這是VB//VBA/VBS是寫高質量代碼的『硬菜』。筆者曾在VB外殼中運用這一原理,將時間線與數據線完美融合,使破殼者不僅要處理數據,還要處理時間,這可以大大延遲破殼的進度。
2、時間合成函數
主要包括dateserial和timeserial,前者根據年月日合成一個date類型的日期部分,后者根據時分秒合成一個date類型的時間部分。在VB/VBA/VBS中隱含的類型的自動轉換通常用字符串直接表示日期和時間,這對于許多需要時間的函數來說是可以接受的。因此,這兩個函數對很多人來說都是無用的,與其單獨寫年月日,不如直接用連字符串在一起。
然而,在特定的應用場景中,特別是在金融和金融證券領域,這兩兄弟可以結合指針使時間的靈活性超出許多人的想象。
3、提取時間屬性函數
Date類型,不僅是Double,也是內存中的8字節整數,還有很多屬性。常見的,年、月、日、分秒都很奇怪,還有相應的特殊函數,想必很多表姐在Excel里都是熟悉的。那一季,周,已經過了天數等屬性,用的人就少了,畢竟大多數人除了自己的口袋,其實并不是真的在乎錢!更何況很多人自己的口袋還縫在管家婆身上。
因此,金錢密集型行業的員工(如金融和金融證券)有更多的機會使用這些屬性。例如,在國外的許多地方,每天或每周的工資。國內企業管理后,有月度報告、季度報告、半年度報告、實時報告、動態預算、各種評估等。此時,時間屬性函數,有一個美妙的用途。

二、Dateadd函數
1、函數功能
該函數為時間加法函數,可在指定時間加上指定單位的時間,如年月日時分秒、季、周等。
2、函數的定義(VB形式)
DateAdd(IntervalAsString,NumberAsDouble,DateAsVariant)AsVariant
3、說明函數參數
Interval是Number參數的時間單位,如下圖所示:
時間間隔單位
由Interval指定的Number是要增加的時間量。為什么這個參數是Double類型?
Date是指定的基準時間,不僅支持Date類型和Double類型的時間,還支持字符串的時間(如1899-12-300:00:00″)。
4、應用
該函數通常與DateDiff函數結合使用,可以在時間軸上向前或向后移動,在時間軸等應用中非常方便。當然,它也可以單獨使用,比如如何獲得系統的啟動時間?如何獲得指定年份的最后一天?如何獲得指定年份的N天日期?
三、時間的概念
我相信大多數人都知道終端右下角或其他角落顯示的時間。事實上,除此之外,還有磁盤文件的創建/訪問/修改時間和系統時間。
眾所周知,地球是一個球,自己旋轉,所以有白天和黑夜,有白天不懂夜晚的黑暗。因為這是白天的工作時間,但是午夜打鼾,所以最近中美領導人視頻會議的時間非常微妙。老拜登省了局,時間正好是我們早上上班的時間,要知道美國那邊的人,大多數人都洗洗睡了。所以,這個時間不是另一個時間,誰在將就誰,就由你說吧。
正因為如此,才有了時區的概念和跨國時差的說法。隨著現代天文地理的發展,跨區域交流越來越頻繁,迫切需要一個全球時間計量,即UTC(協調世界時,又稱世界統一時間和世界標準時間)。
然而,如果每個人都不分場合地使用這個全球標準時間,就會導致傳統時間概念的混亂。例如,我們可以說,我們在早上90點的視頻中會見了老拜登,但美麗的中國人不能這么說,否則就是瞎說。因此,為了配合各地的實際生產生活,有當地的時間,甚至有夏令時間。也就是說,在實際應用中,時間各不相同,包括北京時間、東京時間和倫敦時間。
屏幕上顯示的時間基本上是指本地時間(即北京時間)。但是,如何將這么多本地時間切換到全球時間呢?因此,格林尼治時間作為時差的起點。這樣,本地時間和UTC就可以隨意切換了。
使用當地時間在一定時區內更方便,但超過太多時區很容易導致混亂。例如,東北地區黎明早,黑暗早。過去,一些東北學生說他們下午3點以后放學,4點吃晚飯晚。當時,作者,一個南方人,仍然感到令人難以置信。
因此,在許多場合,特別是在計算機領域,真正的時間是使用UTC時間。例如,磁盤中的文件時間、網站上的時間等。