Autohotkey v2 獲取當(dāng)前時間戳函數(shù)的實現(xiàn) ahk所有關(guān)于時間的操作總結(jié)

獲取當(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)前本地時間.注意: 可以使用 DateAddDateDiff 執(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(天).

返回值是字符串

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容