aardio 文档

time 库

日期时间函数库,这是自动导入的内置库。

time 时间对象

time 结构体用于表示日期时间对象,其声明如下:

class time{
    WORD year; //年
    WORD month;//月
    WORD dayofweek; //星期
    WORD day; //日期
    WORD hour; //小时
    WORD minute; //分钟
    WORD second; //秒
    WORD milliseconds;//这个字段正常情况下为0,只有在WinAPI函数中会起作用
    format = "%Y/%m/%d %H:%M:%S"; //时间格式字符串 
}

time 结构体兼容 WinAPI 的 SYSTEMTIME 结构体、兼容 COM 接口日期时间对象。 可在 WinAPI 函数,COM 函数中直接使用。

创建时间对象

函数原型:

dateTime = time( strOrTimestampOrTableOrTime,format,locale);

函数说明:

构造并返回时间对象。
参数@1可以是表示时间的数值、字符串、参数表、或其他 time,time.ole 对象。

参数 @1 可以用一个普通的表指定部分时间字段,也可以传入另外一个需要复制的 time 或 time.ole 对象。time 将会构造一个新的日期时间对象并返回。

不指定参数@1默认初始化为当前时间。

可选用参数@2指定格式化串,格式化串的首字符为!表示 UTC 时间。省略格式串时默认值为'%Y/%m/%d %H:%M:%S',可兼容解析 ISO8601 格式时间。

格式化串有两个作用:

可在创建时间对象以后使用 format 属性修改格式化串。

请参考:日期时间格式化语法

可选用第三个参数 @locale 指定对象文本格式化使用的区域语言。 locale 支持的参数与 setlocale 相同,例如英文为 "enu", 简体中文为"chs" 。也可以在时间对象的 locale 属性指定格式化使用的语法,如果不指定则使用默认的区域设置 - 默认区域设置可使用 setlocale()函数进行设置,例如 setlocale("all","chs")setlocale("time","chs") 应用简体中文格式化,而使用 setlocale("time","enu")应用英文语言格式化时间。

格式化串如果将 ! 作为第一个字符表示使用 UTC 标准时间,否则使用本地区域时间。UTF 时间可以使用时间对象的 local() 函数转为本地时间,而本地时间可以使用对象的 utc() 函数转换为 UTC 时间。

不同参数用法:

返回值说明:

返回的时间对象可传入其他线程使用。

返以回的时间对象可作为调用 tonumber 的参数转换为自 UTC 时间 1970年1月1日 00:00:00 到 3000年12月31日23:59:59 之间的秒数。需要更宽的运算范围请使用 time.ole 对象。

返以回的时间对象可作为调用 tostring 函数的参数转换为字符串。

可选用参数@2指定格式化串,首字符为!表示 UTC 时间。 参数@1 为文本时,则依据参数@2指定的格式化串解析获取时间。

示例:

//如果省略所有参数返回当前时间
var tm = time(); 

//自文本解析时间
var tm2 = time("2017-05-27T16:56:01Z",'%Y/%m/%d %H:%M:%S');

//格式化为字符串
var str = tostring(tm2); 

datetime类型转换: 转换为字符串或数值

var tm = time();

//返回时间戳数值,以秒为单位
var n = tonumber(tm); 

//修改格式化串
tm.format = "%Y年%m月%d日 %H时%M分%S秒";

//返回格式化的时间字符串
var s = tostring(tm); 

检测时间对象

可以使用 type.eq 函数检查两个时间对象是否相等。
也可使用 time.istime 函数判断对象是否一个时间对象。

type.eq 是严格判别类型,而 time.istime 是兼容性检测,只要拥有相同的结构体声明都会返回true。time.istime 检测返回为真的对象,同样意谓着可以通用于 COM 函数,API 函数,对于时间类型都会使用 time.istime 进行检测。

import console; 
import time.ole;

var tm = time();

//输出 true
console.log( time.istime(tm) )

var oletm = time.ole(); 

//输出 true,兼容time对象
console.log( time.istime(oletm) )

//输出 false,不相等
console.log( !! type.eq(oletm,tm) )

console.pause(); 

时间格式化语法 #

创建时间的time对象构造函数的第二个参数可以指定格式化字符串,不指定格式化串时默认值为'%Y/%m/%d %H:%M:%S'。 也可以在创建时间对象以后使用 format 属性修改格式化串。

格式化串如果将 ! 作为第一个字符表示使用 UTC 标准时间,否则使用本地区域时间。UTF 时间可以使用时间对象的 local() 函数转为本地时间,而本地时间可以使用对象的 utc() 函数转换为 UTC 时间。

格式化时间时可以使用第三个参数指定格式化使用的语言, 例如 tm = time(,"%a %B %Y %m %d %H:%M:%S","enu") 的最后一个参数"enu"找定了格式化时使用英文语言。中文则为"chs",也可以在时间对象的 locale 属性指定格式化使用的语法,如果不指定则使用默认的区域设置 - 默认区域设置可使用 setlocale()函数进行设置,例如:setlocale("all","chs") 或 setlocale("time","chs") 应用简体中文格式化,而使用 setlocale("time","enu") 应用英文语言格式化时间。

在格式化串中,每一个 % 号声明一个格式化标记,全部可用的格式化标记如下表: `

使用格式串解析文本并转换为时间时,除上述匹配时间的标记以外, 其他分隔字符支持宽松的模糊匹配,规则如下:

如果输入文本中的时间数值超出日期范围,则返回 null 。但如果出现当月不存在的日期且小于 31 号时会顺推为下月时间。 如果格式化时间未完成,但输入文本提前结束则返回 null 。

如果最后一个格式化标记解析成功以后如果还有剩余的字符串, 首先跳过前面的空白字符,从前面取其他连续的非空白字符存入时间对象的endstr属性内。endstr可用于后续解析 ISO8601 等格式的时区,可参考 builtin 库中 time.iso8601 函数的源码。

下面是一个使用格式化代码的示例:

import console;

//从字符串创建时间值
var tm = time("2006/6/6 12:56:01","%Y/%m/%d %H:%M:%S");

//改变格式化模式串
tm.format = "%Y年%m月%d日 %H时%M分%S秒";

//从时间值创建字符串
var str = tostring(tm);

//打印结果到控制台窗口
console.log(str);

console.pause();

时间的加减运算

时间对象可以使用 tonumber 函数转换为以秒为单位的数值( time.ole 对象则转换为以天为单位的数值) 进行运算。

我们也可以直接使用 time 对象提供的方法进行加减运算。

import console;
var dateTime = time.now();

dateTime.year += 2;
console.log(dateTime,"增加2年")

dateTime.addsecond(30)
console.log(dateTime,"增加30秒")

dateTime.addminute(180)
console.log(dateTime,"增加180分")

dateTime.addhour(2)
console.log(dateTime,"增加两小时")

dateTime.addday(365)
console.log(dateTime,"增加365天")

dateTime.addmonth(-24)
console.log(dateTime,"倒退24个月")

var tm2 = time.now()

//计算相差时间
console.dumpJson(
    相差月份 = tm2.diffmonth(dateTime);
    相差天数 = tm2.diffday(dateTime);
    相差小时数 = tm2.diffhour(dateTime);
    相差分钟数 = tm2.diffminute(dateTime);
    相差秒数 = tm2.diffsecond(dateTime);
    相差秒数2 = tonumber(dateTime) - tonumber(tm2); 
) 

console.pause();

使用 add... 系列函数修改时间将自动计算并更新时间对象的所有字段。

而直接指定时间对象的部分字段,aardio 不保证时间的合法性,也不会自动更新 dayOfWeek 字段,也可以主动调用 tm.update() 函数重新计算时间并更新该字段。

datetime 的关系运算

import console;

var dateTime = time.now();
dateTime.year += 2;

var tm2 = time.now(); 

//关系运算
console.dumpTable( 
    相等 = tm2 == dateTime;
    大于 = tm2 > dateTime;
    小于等于 = tm2 <= dateTime;
)

console.pause()

time 对象 在 WinAPI 函数中的运用

//创建 UTC 时间
var dateTime = time.utc();

//调用 API 函数
::Kernel32.GetSystemTime(dateTime);

Markdown 格式