獲取當(dāng)前時間戳,ahk沒有提供一個默認(rèn)的函數(shù),其實實現(xiàn)起來也不是很難
unix時間戳實際上是1970年1月1日 0點(diǎn)準(zhǔn)點(diǎn)的時間到當(dāng)前時間(UTC時區(qū))的秒數(shù)。也有毫秒級的時間戳,但是一般的應(yīng)用場景,秒就夠用了。
autohotkey 關(guān)于時間格式化的函數(shù)FormatTime都提供了,竟然就沒有一個直接獲取時間戳的,也是挺迷
另外還有兩個對時間進(jìn)行計算的函數(shù) DateDiff和DateAdd
這次我們用DateDiff函數(shù)進(jìn)行實現(xiàn)
; 獲取當(dāng)前的時間戳精確到秒
GetCurrentTimeStamp(){
; unix時間戳的起始時間精確到秒
startTime :='19700101000000'
; datediff 計算現(xiàn)在的utc時間到unix時間戳的起始時間經(jīng)過的秒數(shù)
return DateDiff(A_NowUTC,startTime,'S')
}
下面了解ahk獲取時間相關(guān)的操作
關(guān)于時間的內(nèi)置變量
| 變量 | 描述 |
|---|---|
| A_YYYY | 4 位數(shù)表示的當(dāng)前年份(例如 2004). 與 A_Year 含義相同.注意: 要檢索符合您區(qū)域設(shè)置和語言的格式化時間或日期, 請使用 FormatTime()(時間和長日期) 或 FormatTime(, "LongDate")(檢索長格式日期). |
| A_MM | 2 位數(shù)表示的當(dāng)前月份(01-12). 與 A_Mon 含義相同. |
| A_DD | 2 位數(shù)表示的當(dāng)前月份的日期(01-31). 與 A_MDay 含義相同. |
| A_MMMM | 使用當(dāng)前用戶語言表示的當(dāng)前月份的全稱, 例如 July |
| A_MMM | 使用當(dāng)前用戶語言表示的當(dāng)前月份的簡稱, 例如 Jul |
| A_DDDD | 使用當(dāng)前用戶語言表示的當(dāng)前星期幾的全稱, 例如, Sunday |
| A_DDD | 使用當(dāng)前用戶語言表示的當(dāng)前星期幾的簡稱, 例如 Sun |
| A_WDay | 1 位數(shù)表示的當(dāng)前星期經(jīng)過的天數(shù)(1-7). 在所有區(qū)域設(shè)置中 1 都表示星期天. |
| A_YDay | 當(dāng)前年份中經(jīng)過的天數(shù)(1-366). 不會使用零對變量的值進(jìn)行填充, 例如檢索到 9, 而不是 009. 要檢索零填充的值, 請使用: FormatTime(, "YDay0"). |
| A_YWeek | 符合 ISO 8601 標(biāo)準(zhǔn)的當(dāng)前的年份和周數(shù)(例如 200453). 要分離年份和周數(shù), 請使用 Year := SubStr(A_YWeek, 1, 4) 和 Week := SubStr(A_YWeek, -2). A_YWeek 的準(zhǔn)確定義為: 如果含有 1 月 1 日的星期內(nèi)有四天或四天以上在新年里, 則它被認(rèn)為是新年的第一個星期. 否則, 它為前一年的最后一個星期, 而下一星期為新年的第一個星期. |
| A_Hour | 在 24 小時制(例如, 17 表示 5pm) 中 2 位數(shù)表示的當(dāng)前小時數(shù)(00-23). 要獲取帶 AM/PM 提示的 12 小時制的時間, 請參照此例: FormatTime(, "h:mm:ss tt")
|
| A_Min | 2 位數(shù)表示的當(dāng)前分鐘數(shù)(00-59). |
| A_Sec | 2 位數(shù)表示的當(dāng)前秒數(shù)(00-59). |
| A_MSec | 3 位數(shù)表示的當(dāng)前毫秒數(shù)(000-999). 要移除前導(dǎo)零, 請參照此例: Milliseconds := A_MSec + 0. |
| A_Now | 以 YYYYMMDDHH24MISS 格式表示的當(dāng)前本地時間.注意: 可以使用 DateAdd 和 DateDiff 執(zhí)行日期和時間的數(shù)學(xué)運(yùn)算. 此外, FormatTime 可以根據(jù)您的區(qū)域設(shè)置或選項來格式化日期和/或時間. |
| A_NowUTC | 以 YYYYMMDDHH24MISS 格式表示的當(dāng)前的協(xié)調(diào)世界時(UTC). UTC 本質(zhì)上和格林威治標(biāo)準(zhǔn)時間(GMT) 一致. |
| A_TickCount | 計算機(jī)自啟動以來經(jīng)過的毫秒數(shù), 最多為 49.7 天. 通過把 A_TickCount 保存到變量中, 經(jīng)過一段時間后從最近的 A_TickCount 值中減去那個變量, 可以計算出所經(jīng)過的時間. 例如:StartTime := A_TickCount Sleep 1000 ElapsedTime := A_TickCount - StartTime MsgBox ElapsedTime " milliseconds have elapsed."如果您需要比 A_TickCount 的 10 ms 更高的精確度, 請使用 QueryPerformanceCounter()(一個高精度計時器). |
FormatTime函數(shù)
將 YYYYMMDDHH24MISS 時間戳轉(zhuǎn)換為指定的日期/時間格式.
String := FormatTime(YYYYMMDDHH24MISS, Format)
第一個參數(shù)是特定格式的時間,如果省略這個參數(shù)就表示使用當(dāng)前時間。
YYYYMMDDHH24MISS 格式中元素表示的含義分別為:
| Element | 描述 |
|---|---|
| YYYY | 年份(4 位數(shù)) |
| MM | 月份(2 位數(shù))(01-12) |
| DD | 月份的天數(shù)(2 位數(shù))(01-31) |
| HH24 | 24 小時格式的小時數(shù)(2 位數(shù))(00-23). 例如, 09 是 9am, 而 21 是 9pm. |
| MI | 分鐘數(shù)(2 位數(shù))(00-59) |
| SS | 秒數(shù)(2 位數(shù))(00-59) |
所以我們格式化時間,只需要給出后面的格式化字符串,能夠用的項目也是比較復(fù)雜的
日期格式(區(qū)分大小寫)
| Format | 描述 |
|---|---|
| d | 不含前導(dǎo)零的天數(shù)(1 – 31) |
| dd | 含前導(dǎo)零的天數(shù)(01 – 31) |
| ddd | 在當(dāng)前的用戶語言里星期幾的簡稱(例如, 周一) |
| dddd | 在當(dāng)前的用戶語言里星期幾的全稱(例如, 星期一) |
| M | 不含前導(dǎo)零的月份(1 – 12) |
| MM | 含前導(dǎo)零的月份(01 – 12) |
| MMM | 在當(dāng)前的用戶語言里月份的簡稱(例如, 一月) |
| MMMM | 在當(dāng)前的用戶語言里月份的全稱(例如, 一月) |
| y | 不含世紀(jì)的年份, 不含前導(dǎo)零(0 – 99) |
| yy | 不含世紀(jì)的年份, 含前導(dǎo)零(00 – 99) |
| yyyy | 含世紀(jì)的年份. 例如: 2005 |
| gg | 當(dāng)前用戶區(qū)域設(shè)置的時代/紀(jì)元字符串(如果沒有則為空) |
時間格式(區(qū)分大小寫)
| Format | 描述 |
|---|---|
| h | 不含前導(dǎo)零的小時數(shù); 十二小時制格式(1 – 12) |
| hh | 含前導(dǎo)零的小時數(shù); 十二小時制格式(01 – 12) |
| H | 不含前導(dǎo)零的小時數(shù); 二十四小時制格式(0 – 23) |
| HH | 含前導(dǎo)零的小時數(shù); 二十四小時制格式(00 – 23) |
| m | 不含前導(dǎo)零的分鐘數(shù)(0 – 59) |
| mm | 含前導(dǎo)零的分鐘數(shù)(00 – 59) |
| s | 不含前導(dǎo)零的秒數(shù)(0 – 59) |
| ss | 含前導(dǎo)零的秒數(shù)(00 – 59) |
| t | 單字符時間標(biāo)記, 例如 A 或 P(取決于區(qū)域設(shè)置) |
| tt | 多字符時間標(biāo)記, 例如 AM 或 PM(取決于區(qū)域設(shè)置) |
獨(dú)立格式
下面的格式必須 單獨(dú) 使用; 即在 Format 參數(shù)中不能含有其他格式或文本. 這些格式不區(qū)分大小寫.
| Format | 描述 |
|---|---|
| (空) | 留空 Format 來生成時間后跟著長日期. 例如, 在某些區(qū)域設(shè)置中它可能看起來像這樣 4:55 PM Saturday, November 27, 2004(譯者注: 顯示的內(nèi)容與順序與系統(tǒng)設(shè)置有關(guān), 中文: 下午 4:55 星期六,2004年11月27日) |
| Time | 當(dāng)前用戶區(qū)域設(shè)置的時間表示, 例如 5:26 PM(譯者注: 顯示的內(nèi)容與順序與系統(tǒng)設(shè)置有關(guān), 中文: 下午 5:26) |
| ShortDate | 當(dāng)前用戶區(qū)域設(shè)置的短日期表示, 例如 02/29/04(譯者注: 顯示的內(nèi)容與順序與系統(tǒng)設(shè)置有關(guān), 中文: 2004/2/29 ) |
| LongDate | 當(dāng)前用戶區(qū)域設(shè)置的長日期表示, 例如 Friday, April 23, 2004(譯者注: 顯示的內(nèi)容與順序與系統(tǒng)設(shè)置有關(guān), 中文: 星期五,2004年4月23日) |
| YearMonth | 當(dāng)前用戶區(qū)域設(shè)置的年份和月份格式, 例如 February, 2004(譯者注: 顯示的內(nèi)容與順序與系統(tǒng)設(shè)置有關(guān), 中文: 2004年2月) |
| YDay | 不含前導(dǎo)零的年份的天數(shù)(1 – 366) |
| YDay0 | 含前導(dǎo)零的年份的天數(shù)(001 – 366) |
| WDay | 星期的天數(shù)(1 – 7). 星期天為 1. |
| YWeek | ISO 8601 中規(guī)定的完全年份和周數(shù). 例如: 200453. 如果含有 1 月 1 日的星期有四天以上在新年里, 則它被認(rèn)為是新年的第一星期. 否則, 它為前一年的最后一個星期, 而下一星期為新年的第一星期. 因此, 1 月 4 日和首個星期四總是在第一周. |
附加選項
下列選項可以緊跟在 YYYYMMDDHH24MISS 時間戳后(如果沒有時間戳, 它們也可以單獨(dú)使用). 在下面的例子中, 請注意最后的四項間沒有逗號:
OutputVar := FormatTime("20040228 LSys D1 D4")
R: 反轉(zhuǎn). 讓日期在時間之前(僅當(dāng) Format 為空時才有意義).
Ln: 如果此選項 不 存在, 則使用當(dāng)前用戶區(qū)域設(shè)置來格式化字符串. 要使用系統(tǒng)的區(qū)域設(shè)置, 請指定 LSys. 要使用特殊的區(qū)域設(shè)置, 請指定字母 L 后面跟著十六進(jìn)制或十進(jìn)制的區(qū)域設(shè)置標(biāo)識符(LCID). 關(guān)于如何構(gòu)建 LCID 的信息, 請在 www.microsoft.com 上搜索下列短語: Locale Identifiers
Dn: 日期選項. 請指定 n 為下列數(shù)字的其中一個:
- 0 = 強(qiáng)制使用默認(rèn)選項. 這也會讓短日期生效.
- 1 = 使用短日期(僅當(dāng) Format 為空時才有意義; 與 2 和 8 不兼容).
- 2 = 使用長日期(僅當(dāng) Format 為空時才有意義; 與 1 和 8 不兼容).
- 4 = 使用備用日歷(如果有).
- 8 = 使用年份-月份格式(僅當(dāng) Format 為空時才有意義; 與 1 和 2 不兼容).
- 0x10 = 為從左到右的閱讀順序布局添加標(biāo)記.
- 0x20 = 為從右到左的閱讀順序布局添加標(biāo)記.
- 0x80000000 = 不遵循任何用戶對系統(tǒng)默認(rèn)日期格式的覆蓋.
- 0x40000000 = 使用系統(tǒng) ANSI 代碼頁而不是區(qū)域設(shè)置代碼頁進(jìn)行字符串轉(zhuǎn)換.
Tn: 時間選項. 請指定 n 為下列數(shù)字的其中一個:
- 0 = 強(qiáng)制使用默認(rèn)選項. 這也使得會顯示分鐘數(shù)和秒數(shù).
- 1 = 省略分鐘數(shù)和秒數(shù).
- 2 = 省略秒數(shù).
- 4 = 省略時間標(biāo)記(例如 AM/PM).
- 8 = 始終使用二十四小時制而不是十二小時制.
- 12 = 上面兩個參數(shù)的組合.
- 0x80000000 = 不遵循任何用戶對系統(tǒng)默認(rèn)日期格式的覆蓋.
- 0x40000000 = 使用系統(tǒng) ANSI 代碼頁而不是區(qū)域設(shè)置代碼頁進(jìn)行字符串轉(zhuǎn)換.
注意: Dn 和 Tn 可以使用多次以使多個選項生效, 例如: FormatTime("20040228 D2 D4 T1 T8")
這邊格式化字符串能搞的花樣還是挺多的。
順便官網(wǎng)上的例子:
TimeString := FormatTime()
MsgBox "The current time and date (time first) is " TimeString
TimeString := FormatTime("R")
MsgBox "The current time and date (date first) is " TimeString
TimeString := FormatTime(, "Time")
MsgBox "The current time is " TimeString
TimeString := FormatTime("T12", "Time")
MsgBox "The current 24-hour time is " TimeString
TimeString := FormatTime(, "LongDate")
MsgBox "The current date (long format) is " TimeString
TimeString := FormatTime(20050423220133, "dddd MMMM d, yyyy hh:mm:ss tt")
MsgBox "The specified date and time, when formatted, is " TimeString
MsgBox FormatTime(200504, "'Month Name': MMMM`n'Day Name': dddd")
YearWeek := FormatTime(20050101, "YWeek")
MsgBox "January 1st of 2005 is in the following ISO year and week number: " YearWeek
DateDiff函數(shù)
Result := DateDiff(DateTime1, DateTime2, TimeUnits)
DateTime1
DateTime2
類型: 字符串
YYYYMMDDHH24MISS 格式的日期-時間戳.
如果 DateTime1 早于 DateTime2, 則結(jié)果為負(fù)數(shù).
如果是空串就會使用當(dāng)前時間 A_Now.
TimeUnits
類型: 字符串
測量差異所用的單位. TimeUnits 可以是下列字符串之一(也可以是其第一個字母): Seconds(秒), Minutes(分), Hours(小時) 或 Days(天).
返回值是整數(shù)
DateAdd函數(shù)
Result := DateAdd(DateTime, Time, TimeUnits)
-
DateTime
類型: 字符串YYYYMMDDHH24MISS 格式的日期-時間戳.
-
Time
類型: 整數(shù)或浮點(diǎn)數(shù)要添加的時間, 以整數(shù)或浮點(diǎn)數(shù)表示. 指定一個負(fù)數(shù)以執(zhí)行減法.
-
TimeUnits
類型: 字符串Time 參數(shù)的單位. TimeUnits 可以是下列字符串之一(也可以是其第一個字母): Seconds(秒), Minutes(分), Hours(小時) 或 Days(天).
返回值是字符串