获取当前时间戳,ahk没有提供一个默认的函数,其实实现起来也不是很难
unix时间戳实际上是1970年1月1日 0点准点的时间到当前时间(UTC时区)的秒数。也有毫秒级的时间戳,但是一般的应用场景,秒就够用了。
autohotkey 关于时间格式化的函数FormatTime都提供了,竟然就没有一个直接获取时间戳的,也是挺迷
另外还有两个对时间进行计算的函数 DateDiff和DateAdd
这次我们用DateDiff函数进行实现
; 获取当前的时间戳精确到秒
GetCurrentTimeStamp(){
; unix时间戳的起始时间精确到秒
startTime :='19700101000000'
; datediff 计算现在的utc时间到unix时间戳的起始时间经过的秒数
return DateDiff(A_NowUTC,startTime,'S')
}
下面了解ahk获取时间相关的操作
关于时间的内置变量
变量 | 描述 |
---|---|
A_YYYY | 4 位数表示的当前年份(例如 2004). 与 A_Year 含义相同.注意: 要检索符合您区域设置和语言的格式化时间或日期, 请使用 FormatTime() (时间和长日期) 或 FormatTime(, "LongDate") (检索长格式日期). |
A_MM | 2 位数表示的当前月份(01-12). 与 A_Mon 含义相同. |
A_DD | 2 位数表示的当前月份的日期(01-31). 与 A_MDay 含义相同. |
A_MMMM | 使用当前用户语言表示的当前月份的全称, 例如 July |
A_MMM | 使用当前用户语言表示的当前月份的简称, 例如 Jul |
A_DDDD | 使用当前用户语言表示的当前星期几的全称, 例如, Sunday |
A_DDD | 使用当前用户语言表示的当前星期几的简称, 例如 Sun |
A_WDay | 1 位数表示的当前星期经过的天数(1-7). 在所有区域设置中 1 都表示星期天. |
A_YDay | 当前年份中经过的天数(1-366). 不会使用零对变量的值进行填充, 例如检索到 9, 而不是 009. 要检索零填充的值, 请使用: FormatTime(, "YDay0") . |
A_YWeek | 符合 ISO 8601 标准的当前的年份和周数(例如 200453). 要分离年份和周数, 请使用 Year := SubStr(A_YWeek, 1, 4) 和 Week := SubStr(A_YWeek, -2) . A_YWeek 的准确定义为: 如果含有 1 月 1 日的星期内有四天或四天以上在新年里, 则它被认为是新年的第一个星期. 否则, 它为前一年的最后一个星期, 而下一星期为新年的第一个星期. |
A_Hour | 在 24 小时制(例如, 17 表示 5pm) 中 2 位数表示的当前小时数(00-23). 要获取带 AM/PM 提示的 12 小时制的时间, 请参照此例: FormatTime(, "h:mm:ss tt") |
A_Min | 2 位数表示的当前分钟数(00-59). |
A_Sec | 2 位数表示的当前秒数(00-59). |
A_MSec | 3 位数表示的当前毫秒数(000-999). 要移除前导零, 请参照此例: Milliseconds := A_MSec + 0 . |
A_Now | 以 YYYYMMDDHH24MISS 格式表示的当前本地时间.注意: 可以使用 DateAdd 和 DateDiff 执行日期和时间的数学运算. 此外, FormatTime 可以根据您的区域设置或选项来格式化日期和/或时间. |
A_NowUTC | 以 YYYYMMDDHH24MISS 格式表示的当前的协调世界时(UTC). UTC 本质上和格林威治标准时间(GMT) 一致. |
A_TickCount | 计算机自启动以来经过的毫秒数, 最多为 49.7 天. 通过把 A_TickCount 保存到变量中, 经过一段时间后从最近的 A_TickCount 值中减去那个变量, 可以计算出所经过的时间. 例如:StartTime := A_TickCount Sleep 1000 ElapsedTime := A_TickCount - StartTime MsgBox ElapsedTime " milliseconds have elapsed." 如果您需要比 A_TickCount 的 10 ms 更高的精确度, 请使用 QueryPerformanceCounter()(一个高精度计时器). |
FormatTime函数
将 YYYYMMDDHH24MISS 时间戳转换为指定的日期/时间格式.
String := FormatTime(YYYYMMDDHH24MISS, Format)
第一个参数是特定格式的时间,如果省略这个参数就表示使用当前时间。
YYYYMMDDHH24MISS 格式中元素表示的含义分别为:
Element | 描述 |
---|---|
YYYY | 年份(4 位数) |
MM | 月份(2 位数)(01-12) |
DD | 月份的天数(2 位数)(01-31) |
HH24 | 24 小时格式的小时数(2 位数)(00-23). 例如, 09 是 9am, 而 21 是 9pm. |
MI | 分钟数(2 位数)(00-59) |
SS | 秒数(2 位数)(00-59) |
所以我们格式化时间,只需要给出后面的格式化字符串,能够用的项目也是比较复杂的
日期格式(区分大小写)
Format | 描述 |
---|---|
d | 不含前导零的天数(1 – 31) |
dd | 含前导零的天数(01 – 31) |
ddd | 在当前的用户语言里星期几的简称(例如, 周一) |
dddd | 在当前的用户语言里星期几的全称(例如, 星期一) |
M | 不含前导零的月份(1 – 12) |
MM | 含前导零的月份(01 – 12) |
MMM | 在当前的用户语言里月份的简称(例如, 一月) |
MMMM | 在当前的用户语言里月份的全称(例如, 一月) |
y | 不含世纪的年份, 不含前导零(0 – 99) |
yy | 不含世纪的年份, 含前导零(00 – 99) |
yyyy | 含世纪的年份. 例如: 2005 |
gg | 当前用户区域设置的时代/纪元字符串(如果没有则为空) |
时间格式(区分大小写)
Format | 描述 |
---|---|
h | 不含前导零的小时数; 十二小时制格式(1 – 12) |
hh | 含前导零的小时数; 十二小时制格式(01 – 12) |
H | 不含前导零的小时数; 二十四小时制格式(0 – 23) |
HH | 含前导零的小时数; 二十四小时制格式(00 – 23) |
m | 不含前导零的分钟数(0 – 59) |
mm | 含前导零的分钟数(00 – 59) |
s | 不含前导零的秒数(0 – 59) |
ss | 含前导零的秒数(00 – 59) |
t | 单字符时间标记, 例如 A 或 P(取决于区域设置) |
tt | 多字符时间标记, 例如 AM 或 PM(取决于区域设置) |
独立格式
下面的格式必须 单独 使用; 即在 Format 参数中不能含有其他格式或文本. 这些格式不区分大小写.
Format | 描述 |
---|---|
(空) | 留空 Format 来生成时间后跟着长日期. 例如, 在某些区域设置中它可能看起来像这样 4:55 PM Saturday, November 27, 2004(译者注: 显示的内容与顺序与系统设置有关, 中文: 下午 4:55 星期六,2004年11月27日) |
Time | 当前用户区域设置的时间表示, 例如 5:26 PM(译者注: 显示的内容与顺序与系统设置有关, 中文: 下午 5:26) |
ShortDate | 当前用户区域设置的短日期表示, 例如 02/29/04(译者注: 显示的内容与顺序与系统设置有关, 中文: 2004/2/29 ) |
LongDate | 当前用户区域设置的长日期表示, 例如 Friday, April 23, 2004(译者注: 显示的内容与顺序与系统设置有关, 中文: 星期五,2004年4月23日) |
YearMonth | 当前用户区域设置的年份和月份格式, 例如 February, 2004(译者注: 显示的内容与顺序与系统设置有关, 中文: 2004年2月) |
YDay | 不含前导零的年份的天数(1 – 366) |
YDay0 | 含前导零的年份的天数(001 – 366) |
WDay | 星期的天数(1 – 7). 星期天为 1. |
YWeek | ISO 8601 中规定的完全年份和周数. 例如: 200453. 如果含有 1 月 1 日的星期有四天以上在新年里, 则它被认为是新年的第一星期. 否则, 它为前一年的最后一个星期, 而下一星期为新年的第一星期. 因此, 1 月 4 日和首个星期四总是在第一周. |
附加选项
下列选项可以紧跟在 YYYYMMDDHH24MISS 时间戳后(如果没有时间戳, 它们也可以单独使用). 在下面的例子中, 请注意最后的四项间没有逗号:
OutputVar := FormatTime("20040228 LSys D1 D4")
R: 反转. 让日期在时间之前(仅当 Format 为空时才有意义).
Ln: 如果此选项 不 存在, 则使用当前用户区域设置来格式化字符串. 要使用系统的区域设置, 请指定 LSys. 要使用特殊的区域设置, 请指定字母 L 后面跟着十六进制或十进制的区域设置标识符(LCID). 关于如何构建 LCID 的信息, 请在 www.microsoft.com 上搜索下列短语: Locale Identifiers
Dn: 日期选项. 请指定 n 为下列数字的其中一个:
- 0 = 强制使用默认选项. 这也会让短日期生效.
- 1 = 使用短日期(仅当 Format 为空时才有意义; 与 2 和 8 不兼容).
- 2 = 使用长日期(仅当 Format 为空时才有意义; 与 1 和 8 不兼容).
- 4 = 使用备用日历(如果有).
- 8 = 使用年份-月份格式(仅当 Format 为空时才有意义; 与 1 和 2 不兼容).
- 0x10 = 为从左到右的阅读顺序布局添加标记.
- 0x20 = 为从右到左的阅读顺序布局添加标记.
- 0x80000000 = 不遵循任何用户对系统默认日期格式的覆盖.
- 0x40000000 = 使用系统 ANSI 代码页而不是区域设置代码页进行字符串转换.
Tn: 时间选项. 请指定 n 为下列数字的其中一个:
- 0 = 强制使用默认选项. 这也使得会显示分钟数和秒数.
- 1 = 省略分钟数和秒数.
- 2 = 省略秒数.
- 4 = 省略时间标记(例如 AM/PM).
- 8 = 始终使用二十四小时制而不是十二小时制.
- 12 = 上面两个参数的组合.
- 0x80000000 = 不遵循任何用户对系统默认日期格式的覆盖.
- 0x40000000 = 使用系统 ANSI 代码页而不是区域设置代码页进行字符串转换.
注意: Dn 和 Tn 可以使用多次以使多个选项生效, 例如: FormatTime("20040228 D2 D4 T1 T8")
这边格式化字符串能搞的花样还是挺多的。
顺便官网上的例子:
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函数
Result := DateDiff(DateTime1, DateTime2, TimeUnits)
DateTime1
DateTime2
类型: 字符串
YYYYMMDDHH24MISS 格式的日期-时间戳.
如果 DateTime1 早于 DateTime2, 则结果为负数.
如果是空串就会使用当前时间 A_Now.
TimeUnits
类型: 字符串
测量差异所用的单位. TimeUnits 可以是下列字符串之一(也可以是其第一个字母): Seconds(秒), Minutes(分), Hours(小时) 或 Days(天).
返回值是整数
DateAdd函数
Result := DateAdd(DateTime, Time, TimeUnits)
-
DateTime
类型: 字符串YYYYMMDDHH24MISS 格式的日期-时间戳.
-
Time
类型: 整数或浮点数要添加的时间, 以整数或浮点数表示. 指定一个负数以执行减法.
-
TimeUnits
类型: 字符串Time 参数的单位. TimeUnits 可以是下列字符串之一(也可以是其第一个字母): Seconds(秒), Minutes(分), Hours(小时) 或 Days(天).
返回值是字符串