時間處理模組

通論
將 Windows API SystemTime 轉成 VB Date
取得系統時間 (依電腦時區設定轉換為格林威治時間)
取得每月第一個星期數日期
等待延遲函數
將 VB Date 轉成 Windows API SystemTime
取得本機時間
取得每年第一個星期數日期

通論

種類 名稱 引數 用途及說明 備註
副程式 Sleep 毫秒 請參見 Windows API 說明 Win32 API 函數
函數 SleepEx 毫秒 請參見 Windows API 說明 Win32 API 函數
副程式 WaitUntilNextTime 日期 等待直到設定時間為止 可便於採用月以上時間單位
函數 timeGetTime 傳回電腦開機後總毫秒數 Win32 API 函數
函數 GetTickCount 傳回電腦開機後總毫秒數 Win32 API 函數
函數 myGetCounterSec 傳回電腦開機後總秒數 自定函數,最大可達 244,951 年,超過超過就會變成負的了

 

範例 說明
Sleep(1500) 等待 1.5 秒
WaitUntilNextTime(Now+TimeSerial(0,0,2)) 等待至 2 秒後那個時刻

timeGetTime:根據 99 年夏季號微軟之友報導,此函數較 VB 內函數 Timer 快 1035%,根據我實際測試的結果在 Pentium II 300 MHz 約 1127%,但在 Pentium 233 MMX 只有 329%,不過總算是快啦!函數傳回值為自開機後的所經過的總毫秒數,函數本身可以判別到 49.71 天,但因為 VB 的 Long 型別不能當純正數,因此只能判別到第 24 天,超過就會變成負的了!當超過 49.71 天又會重新計數,當然,只要重開機就會自動重新計數!

執行效能比較

在 Pentium 233 MMX 下,分別測試時間相關函數執行 100,000 次所需時間,整理如下表, QueryPerformanceCounter 雖然屬於高解析度函數,但平均每執行所花時間較 GetTickCount 為長,但 GetTickCount 解析度不足,約在 10 ms 左右,每 10 ms 內 GetTickCount 傳回值均相同,至於 timeGetTime 與 Timer 的比較,則與前述結果相同

函數 類別 所花時間 (秒)
QueryPerformanceCounter API 0.73167
GetTickCount API 0.13600
timeGetTime API 4.08500
Timer VB 12.96094
myGetCounterSec 自定函數 1.43367

 

等待延遲函數

函數名:MyWait ,傳回實際等待秒數

引數 類型 說明
mySecond Variant 可以使用實數秒數,直接用秒比較習慣
bDoEvents Boolean 是否允許 CPU 處理其他事件,預設為 True

說明:本函數為精確計時,不允許 CPU 處理其他事件時,最小等待時間解析度小於 0.1 ms ,允許 CPU 處理其他事件時,最小等待時間解析度小於 10 ms,最大有效時距大於 244,951 年

範例:

Debug.Print MyWait(2) ' 傳回實際等待時間 2.00001843812333 秒
Debug.Print MyWait(0.0001,False) ' 傳回實際等待時間 0.000100571581823363 秒

將 Windows API SystemTime 轉成 VB Date

函數名:mySystemTimeToVariantTime,傳回日期格式

引數 類型 說明
lpSystemTime SYSTEMTIME SYSTEMTIME 為 Windows API 的自訂型態

範例:

mySystemTimeToVariantTime(myVariantTimeToSystemTime(Now)) ' 傳回 Now

將 VB Date 轉成 Windows API SystemTime

函數名:myVariantTimeToSystemTime,傳回 SYSTEMTIME

引數 類型 說明
vTime 日期 日期格式

範例:

mySystemTimeToVariantTime(myVariantTimeToSystemTime(Now)) ' 傳回 Now

取得系統時間 (依電腦時區設定轉換為格林威治時間)

函數名:myGetSystemTime,傳回日期格式

範例:

Debug.Print myGetSystemTime ' 傳回 Now - 8 hour

取得本機時間

函數名:myGetLocalTime,傳回日期格式

範例:

Debug.Print myGetLocalTime ' 傳回 Now

取得每月第一個星期數日期

函數名:myGetFirstDayOfMonth,傳回日期格式

引數 類型 說明
hDate 日期 該月的任一天均可
Flags VbDayOfWeek 星期數,預設為星期天

範例:

Debug.Print myGetFirstDayOfMonth(#2001/6/1#) ' 傳回 2001/6/3

Debug.Print myGetFirstDayOfMonth(#2001/6/15#, vbFriday) ' 傳回 2001/6/1

取得每年第一個星期數日期

函數名:myGetFirstDayOfYear,傳回日期格式

引數 類型 說明
hDate 日期 該年的任一天均可
Flags VbDayOfWeek 星期數,預設為星期天

範例:

Debug.Print myGetFirstDayOfYear(#2001/6/15#) ' 傳回 2001/1/7

Debug.Print myGetFirstDayOfYear(Now, vbMonday) ' 傳回 2001/1/1