Autohotkey v2 获取当前时间戳函数的实现 ahk所有关于时间的操作总结

获取当前时间戳,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(天).

返回值是字符串

你可能感兴趣的:(Autohotkey v2 获取当前时间戳函数的实现 ahk所有关于时间的操作总结)