ObjectScript数据类型 - 日期
$HOROLOG($H)
表示当前的本地日期和时间,是由两个整数值组成的字符串,这些整数是计数器,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss
代码示例:
w $H,!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,54930
第一个整数,ddddd,是当前日期,表示为自1840年12月31日以来的天数,其中第1天是1841年1月1日。这个日期到达的最大年年限是9999年12月31日,所以这个整数的最大值是2980013。$HOROLOG不能直接用于表示1840年到9999年范围之外的日期
第二个整数,sssss,是当前的时间,表示为从当天午夜开始的秒数计数。系统将时间字段从0递增到86399秒。当午夜时分达到86399时,系统将时间字段重置为0,并将日期字段增加1。
你可以通过调用Horolog()方法获得相同的当前日期和时间信息,如下所示。
WRITE $SYSTEM.SYS.Horolog()
$NOW()
$NOW()返回当前进程的本地日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss.ffffff
代码示例:
w $NOW(),!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,54930.383622
$ZTIMESTAMP
$ZTIMESTAMP返回UTC日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。带有小数秒,小数秒以三位数的精度表示(Windows系统),或以六位数的精度表示(UNIX®系统)
代码示例:
w $ZTIMESTAMP,!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,26130.383
$NOW() vs $HOROLOG vs $ZTIMESTAMP
$HOROLOG包含了InterSystems IRIS存储格式的、经过变体调整的本地日期和时间。本地时区是由$ZTIMEZONE特殊变量的当前值决定的,然后根据本地时间变体进行调整,如夏令时。它只返回整数秒,小数秒会被截断。
$NOW()根据$ZTIMEZONE特殊变量的值确定本地时区。本地时间不会因本地时间变体(如夏令时)而调整。因此,它可能与本地时钟时间不一致。$NOW(tzmins)返回与指定的tzmins时区参数对应的时间和日期。$ZTIMEZONE的值被忽略。
$ZTIMESTAMP返回UTC日期和时间。
日期和时间的转换
$ZDATE
将$HOROLOG的日期部分,即ddddd,转换为用户可读的形式。
WRITE $ZDATE($PIECE($HOROLOG,",",1))
输出结果为:
12/29/2021
$ZTIME
将$HOROLOG的时间部分,即sssss,转换为用户可读的形式。
$ZDATETIME
将$HOROLOG的日期和时间,同时转换为用户可读的形式。
当使用$HOROLOG时,在这些函数中设置时间值的精度总是返回零作为小数秒。
$ZDATETIME(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZDT(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
参数描述请参考参数解析
参数 | 描述 |
---|---|
hdatetime | 内部格式的日期和时间值:$HOROLOG]或者 $ZTIMESTAMP |
dformat | 一个整数,指定返回日期值的格式 |
tformat | 一个整数,指定返回时间值的格式 |
precision | 一个整数,指定返回时间值的小数位数(小数秒):只有当hdatetime格式可以包括小数时间值($ZTIMESTAMP格式),并且选择的tformat选项包括秒时,精度才适用。 |
monthlist | 可选的 - 一个字符串或一个变量的名称,用于指定一组月名。 这个字符串必须以一个分界符开始,它的12个条目必须以这个分界符分开。 例如: January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec monthlist仅在dformat为2、5、6、7、9、18或20时有效。 |
yearopt | 一个整数代码,指定以两位数或四位数的数值表示年份。 |
startwin | 滑动窗口的开始,在这个窗口中,日期用两位数的年份表示。 当你使用yearopt为3或5时,你必须提供startwin,startwin对任何其他yearopt值都是无效的。 当yearopt=3时,startwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的开始日期。 当yearopt=5时,startwin是一个数值,表示滑动窗口的起始年份,以当前年份之前的年数表示。 |
endwin | 滑动窗口的末端,在这个窗口中,日期用两位数的年份表示。 当yearopt为3或5时,你可以选择提供endwin。endwin在任何其他yearopt值下无效。 当yearopt=3时,endwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的结束日期。 当yearopt=5时,endwin是一个数值,表示滑动窗口的结束年限,以当前年限后的年数表示。 当yearopt=5时,滑动窗口总是从startwin中指定的年份的1月1日开始,到endwin中指定的年份的12月31日结束,或者是隐含的结束年份(如果你省略endwin)。 如果省略endwin(或指定为-1),有效的滑动窗口将是100年的长度。 如果你同时提供startwin和endwin,它们指定的滑动窗口的持续时间不能超过100年。 |
mindate | 有效日期范围的下限。指定为$HOROLOG的整数日期计数,例如 0代表1840年12月31日,2/22/2018表示为64701。 支持的mindate值:正的整数,0 或-1 |
maxdate | 有效日期范围的上限,指定为整数$HOROLOG日期计数. 例如,1/1/2100表示为94599 指定一个大于maxdate的hdatetime日期会产生一个VALUE OUT OF RANGE错误。 指定一个大于2980013的maxdate会产生一个VALUE OF RANGE错误。 你可以指定maxdate,也可以不指定mindate。指定一个小于mindate的maxdate会产生一个ILLEGAL VALUE错误。 |
erropt | 当hdatetime无效时要返回的表达式。为这个参数指定一个值可以抑制与无效或超出范围的hdatetime值有关的错误代码。$ZDATETIME不发出错误信息,而是返回erropt。 |
localeopt | 一个布尔标志,指定对dformat、tformat、monthlist、yearopt、mindate和maxdate默认值以及其他日期和时间特征使用哪种语言: localeopt=0:当前语言属性设置决定这些参数默认值。 localeopt=1:ODBC标准语言决定这些参数默认值。 localeopt没有指定:dformat值决定这些参数默认值。 |
$ZDATETIMEH
将用户可读的日期和时间,转换为$HOROLOG(ddddd,sssss)格式
$ZDATETIMEH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZDTH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
参数描述请参考参数解析
可以使用 "T "或 "t "字母代码来指定当前日期。但是,dformat必须是5、6、7、8、9或15。
WRITE $ZDATETIMEH("T",5)
输出:
66107,0
当前日期前三天:
WRITE $ZDATETIMEH("T-3",5)
输出:
66104,0
$ZTIMEZONE : 时区
$ZTIMEZONE是一个从格林威治子午线开始的固定时区偏移量,它不对当地的季节性时间变体进行调整,如夏令时。
代码示例:
w $ZTIMEZONE,!
输出结果为:
-480