通論 將 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