第四十五章 Caché 函数大全 $NOW 函数

第四十五章 Caché 函数大全 $NOW 函数

返回当前日期的本地日期和时间,以小数秒为单位。

大纲

$NOW(tzmins)

参数

  • tzmins
    • 可选—正整数或负整数,以分钟为单位指定距格林威治子午线的期望时区偏移量。值0对应于格林威治子午线。正整数对应于格林威治以西的时区;负整数对应于格林威治东部的时区。例如,值300对应于格林威治以西5小时(300分钟)的美国东部标准时间。允许值的范围是-1440至1440;值超出此范围会导致错误。
    • 如果省略tzmins,则$NOW函数将根据$ZTIMEZONE特殊变量值返回本地日期和时间。 $NOW函数支持的$ZTIMEZONE值的范围是-1440至1440;值超出此范围会导致错误。

描述

$NOW可以返回以下内容:

  • 当前本地日期和时间,以秒为单位表示当前进程。
  • 当前进程在指定时区的本地日期和时间,以小数秒为单位。

$NOW函数返回一个字符串,该字符串由两个数值组成,以逗号分隔。第一个数字是代表当前本地日期的整数。第二个是代表当前本地时间的小数。这些值是计数器,而不是用户可读的日期和时间。

$NOW以Caché存储($HOROLOG)格式返回日期和时间,并带有小数秒的附加功能。 $NOW以以下格式返回当前本地日期和时间:ddddd,sssss.ffffff

第一个整数(ddddd)是自1840年12月31日以来的天数,其中第1天是1841年1月1日。此日期整数的最大值是2980013,对应于9999年12月31日。

第二个数字(ssssss.ffffff)是自当天午夜以来的秒数(以及小数秒)。 Caché将sssss字段从0递增到86399秒。当它在午夜达到86399时,Caché将sssss字段重置为0,并将日期字段递增1。注意,在午夜之后的第一秒内,秒表示为0.ffffff(例如0.123);此数字不是ObjectScript规范形式(例如.123),这会影响这些值的字符串排序顺序。可以在执行排序操作之前在加号(+)之前强制将数字转换为规范形式。ffffff小数位数是当前操作系统支持的最大精度。

$NOW函数可以在有或没有参数值的情况下调用。括号是必需的。

没有参数值的$NOW返回当前进程的当前本地日期和时间。它根据$ZTIMEZONE特殊变量中设置的值确定本地时区。设置$ZTIMEZONE会更改$NOW的时间部分,并且此时间更改也会更改$NOW的日期部分。

注意

$NOW当地时间值可能与本地时钟时间不对应。 $NOW使用$ZTIMEZONE值确定本地时间。 $ZTIMEZONE全年持续;它不会针对夏令时(DST)或其他当地时间变化进行调整。

使用格林威治子午线的时区计数来计算UTC时间的偏移量。它不是你本地时间与本地格林威治时间的比较。格林威治标准时间(GMT)一词可能令人困惑;格林威治的当地时间与冬季的UTC相同。在夏季,它与UTC相差一小时。这是因为应用了称为英国夏令时的本地时差。 $NOW忽略所有本地时变。

同样,由于$NOW将其时间值与系统时钟重新同步,因此$NOW与其他Caché时间函数和特殊变量之间的时间值比较可能会显示出细微的差异。此变化限制为0.05秒;但是,在此变化范围内,比较可能会产生误导性的结果。例如,WRITE $NOW(),!,$HOROLOG可能会产生如下结果:

61438,38794.002085
61438,38793

此异常是由0.05秒的重新同步变化和分数秒的$HOROLOG截断引起的。

带有参数值的$NOW返回与以tzmins为单位的时区相对应的时间和日期。 $ZTIMEZONE的值将被忽略。

时间函数比较

比较了返回当前日期和时间的各种方法,如下所示:

  • $NOW返回当前进程的本地日期和时间。 $NOW以Caché存储格式返回日期和时间。它包括小数秒;小数位数是当前操作系统支持的最大精度。
    • $NOW()根据$ZTIMEZONE特殊变量的值确定本地时区。本地时间未针对本地时间变量进行调整,例如夏令时。因此,它可能与本地时钟时间不对应。
    • $NOW(tzmins)返回与指定的tzmins时区参数相对应的时间和日期。 $ZTIMEZONE的值将被忽略。
  • $HOROLOG以Caché存储格式包含经过变量调整的本地日期和时间。本地时区由$ZTIMEZONE特殊变量的当前值确定,然后针对本地时间变量(例如,夏令时)进行调整。它只返回整秒。小数秒被截断。
  • $ZTIMESTAMP以Caché存储格式包含UTC(世界标准时间)日期和时间(以小数秒为单位)。小数秒以三位精度(在Windows系统上)或六位精度(在UNIX®系统上)表示。因此,$NOW(0)返回的UTC时间的秒精度要比$ZTIMESTAMP高。

这些返回当前日期和时间的方法都不能完全替代过时的$ZUTIL(188)函数,该函数提供了本地日期和时间以及本地时间变体和小数秒的调整。

DHC-APP>w $zutil("188")
65644,81627.106176
DHC-APP>w $now()
65644,81630.608212
DHC-APP>W $H
65644,81633

Windows上的微秒

Windows系统上的微秒精度通常比其他平台的精度低。这是由于QueryPerformanceCounter()Windows库例程的限制。 Caché通过将QueryPerformanceCounter()计算的结果与用于其他日期/时间函数的系统时钟进行比较来确定微秒,该时钟的精度最高为1毫秒(根据运行Windows的硬件,精度通常在1到20毫秒之间)。 $NOW微秒精度时钟与毫秒级精度时钟相差超过50毫秒,Caché向前或向后调整微秒级精度时钟,以与精度更高(但精度较低)的毫秒级时钟一致。

因此,在Windows上,$NOW函数(和传统的$ZUTIL(188)函数)仅适用于在很短的持续时间内(不超过几秒钟)测量微秒精度的时间间隔。在具有多个CPU内核的系统上,每个内核的CachéWindows进程将进行微秒调整,该调整仅针对单个进程。这意味着在不同的CachéCPU进程上返回的$NOW值可能彼此不一致。当Windows在多核CPU芯片上托管的虚拟机上运行时,CPU进程之间的差异更加明显。

分隔日期和时间

要仅获取$NOW的日期部分或时间部分,可以使用$PIECE函数,将逗号指定为定界符:

/// d ##class(PHA.TEST.Function).NOW()
ClassMethod NOW()
{
    SET dateval=$PIECE($NOW(),",",1)
    SET timeval=$PIECE($NOW(),",",2)
    WRITE !,"Date and time: ",$NOW()
    WRITE !,"Date only: ",dateval
    WRITE !,"Time only: ",timeval
}
DHC-APP>d ##class(PHA.TEST.Function).NOW()
 
Date and time: 65644,81724.239158
Date only: 65644
Time only: 81724.239154

设定日期

$NOW$ZTIMESTAMP返回的值不能使用%SYSTEM.Process类的FixedDate()方法设置。

可以使用%SYSTEM.Process类的FixedDate()方法将$HOROLOG中包含的值设置为当前过程的用户指定日期。

示例

以下示例显示了两种返回当前本地日期和时间的方法:

DHC-APP> WRITE $ZDATETIME($NOW(),1,1,3)," $NOW() date & time",!
09/22/2020 22:43:22.565 $NOW() date & time
 
DHC-APP>WRITE $ZDATETIME($HOROLOG,1,1,3)," $HOROLOG date & time"
09/22/2020 22:43:28.000 $HOROLOG date & time
DHC-APP>WRITE $ZDATETIME($HOROLOG,3,1,6)
2020-09-22 22:44:47.000000
DHC-APP>WRITE $ZDATETIME($now(),3,1,6)
2020-09-22 22:44:58.894816

请注意,$HOROLOG会针对本地时间变量进行调整,例如夏令时。 $NOW不会针对当地时间变化进行调整。

下面的示例使用$ZDATE$NOW中的日期字段转换为日期格式。

DHC-APP> WRITE $ZDATE($PIECE($NOW(),",",1))
09/22/2020

下面的示例将$NOW的时间部分转换为12小时(上午或下午)时钟的小时:分钟:秒.ffff形式的时间。

/// d ##class(PHA.TEST.Function).NOW1()
ClassMethod NOW1()
{
   
    NEW
    SET Time = $PIECE($NOW(),",",2)
    SET Sec = Time # 60
    SET Totmin = Time \ 60
    SET Min = Totmin # 60
    SET Milhour = Totmin \ 60
    IF (Milhour = 12) { 
        SET Hour = 12,Meridian = " pm" 
    } ELSEIF (Milhour > 12) { 
        SET Hour = Milhour-12, Meridian=" pm" 
    } ELSE { 
        SET Hour = Milhour, Meridian=" am" 
    }
    WRITE !,Hour,":",Min,":",Sec,Meridian
    QUIT
}
DHC-APP>d ##class(PHA.TEST.Function).NOW1()
 
10:48:38.77612 pm
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352