文章
Jingwei Wang · 十二月 29, 2021 阅读大约需 5 分钟

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 一个布尔标志,指定对dformattformatmonthlistyearoptmindatemaxdate默认值以及其他日期和时间特征使用哪种语言: 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
0
0 55
讨论 (0)1
登录或注册以继续