文章目录

  • 第八十六章 Caché 函数大全 $ZDATETIMEH 函数
  • 大纲
    • 参数
  • 描述
  • 参数
    • datetime
    • dformat
    • dformat Default
    • dformat Settings
    • tformat
    • 12–hour Clock (tformat 3 and 4)
    • monthlist
    • yearopt
    • startwin
    • endwin
    • mindate
    • maxdate
    • erropt
    • localeopt
  • 注意
    • `$ZDATETIMEH`和小数秒
    • `$ZDATETIMEH`的值无效
    • 当前日期
    • `$ZDATETIMEH`与`$ZDATEH`相比

 

 
第八十六章 Caché 函数大全 $ZDATETIMEH 函数

验证日期和时间,并从显示格式转换为Caché内部格式。

大纲
$ZDATETIMEH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZDTH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)

参数

  • datetime 日期和时间输入值。以显示格式指定的日期/时间字符串。 $ZDATETIMEH将此日期/时间字符串转换为$HOROLOG格式。 datetime值可以是明确的日期和时间(以各种格式指定),明确的日期(以各种格式指定)且时间值默认为0,或者是字符串“T”或“t”,代表当前日期,指定的时间值或默认为0。“T”或“t”字符串可以选择包含有符号整数偏移量。请参阅下面的日期时间。
  • dformat 可选—一个整数代码,用于指定datetime的日期部分的日期格式。如果datetime为“T”,则dformat必须为5、6、7、8、9或15。请参见下面的dformat。
  • tformat 可选—一个整数代码,用于指定datetime的时间部分的时间格式。请参阅下面的tformat。
  • monthlist 可选-字符串或变量名称,用于指定一组月份名称。该字符串必须以分隔符开头,并且其12个条目必须由该分隔符分隔。请参阅下面的月列表。
  • yearopt 可选—整数代码,用于指定是将年表示为两位数字还是四位数字的值。请参阅下面的yearopt。
  • startwin 可选-滑动窗口的开始,其间的日期必须用两位数的年份表示。请参阅下面的startwin。
  • endwin 可选-滑动窗口的末尾,其间用两位数的年份表示日期。请参阅下面的endwin。
  • mindate 可选-有效日期范围的下限。指定为$HOROLOG整数日期计数,0表示1840年12月31日。可以指定为正整数或负整数。请参阅下面的提示。
  • maxdate 可选-有效日期范围的上限。指定为$HOROLOG整数日期计数。请参阅下面的maxdate。
  • erropt 可选-当datetime无效时返回的表达式。为该参数指定值将抑制与无效或超出范围的日期时间值相关的错误代码。 $ZDATETIMEH而不是发出错误消息,而是返回erropt。请参阅下面的错误提示。
  • localeopt 可选-布尔值标志,用于指定dformat,tformat,monthlist,yearopt,mindate和maxdate默认值以及其他日期和时间特征(例如DateSeparator字符:)使用的语言环境。localeopt = 0:当前的语言环境属性设置确定这些参数默认值。localeopt = 1:ODBC标准语言环境确定这些参数默认值。未指定localeopt:dformat值确定这些参数默认值。如果dformat = 3,则使用ODBC默认值。日文和回教日期dformatvalues使用其自己的默认值。对于所有其他dformat值,当前的语言环境属性设置用作默认值。请参阅下面的localeopt。可选-一个布尔标志,指定要使用的语言环境。设置为0时,当前语言环境确定日期分隔符,时间分隔符以及用于格式化日期和时间的其他字符,字符串和选项。为1时,ODBC语言环境确定这些字符,字符串和选项。除非dformat = 3,否则默认值为0,在这种情况下,默认值为1。请参见下文。

指定参数值之间的省略参数由占位符逗号指示。末尾的占位符逗号不是必需的,但允许使用。逗号之间允许有空格,以指示省略的参数。

描述

$ZDATETIMEH验证指定的日期和时间值,并将其从显示格式转换为内部格式。相应的$ZDATETIME函数将日期和时间从内部格式转换为显示格式。内部格式是$HOROLOG或$ZTIMESTAMP使用的格式。它用两个数字值的字符串表示一个日期和时间值,两个数字值之间用逗号分隔。

返回的确切值取决于使用的参数。

$ZDATETIMEH(datetime)将格式为“ MM / DD / [YY] YY hh:mm:ss [.ffff]”的日期和时间值转换为$HOROLOG格式。

语法 含义
MM 一个两位数的月份。
DD 两位数的日期。
[YY]YY 从1900年到1999年的年份中的两位或四位数。在1900年之前或1999年之后的年份中的四位数。
hh 24小时制的小时。
mm 分。
ss 秒。
ffff 小数秒(0到9位数字)。

$ZDATETIMEH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt)将日期和时间中最初指定的日期和时间值(通过 Z D A T E T I M E ) 转 换 为 ‘ ZDATETIME)转换为` ZDATETIME)转换为‘HOROLOG或 Z T I M E S T A M P ‘ 格 式 。 d f o r m a t , t f o r m a t , y e a r o p t , s t a r t w i n 和 e n d w i n 值 与 ‘ ZTIMESTAMP`格式。 dformat,tformat,yearopt,startwin和endwin值与` ZTIMESTAMP‘格式。dformat,tformat,yearopt,startwin和endwin值与‘ZDATETIME`使用的值相同。

使用5、6、7、8或9的dformat时,$ZDATETIMEH会识别并转换任何与格式代码1、2、3、5、6、7、8、9相对应的外部美国日期格式的日期。 。有关有效的美国日期格式的完整列表,请参见$ZDATEH。当使用15的dformat时,$ZDATETIMEH会识别并转换任何明确的欧洲日期格式的日期。有关有效的欧洲日期格式的完整列表,请参见$ZDATEH。

dformat值5、6、7、8、9或15也可以接受字母“T”或“t”指定的当前日期,可以选择在其后跟加号(+)或减号(-),以及当前日期之后或之前的天数。

$ZDATETIMEH可以识别并转换八种时间格式中的任何时间,无论在函数调用中指定哪种时间格式。此外,$ZDATETIMEH识别后缀“AM,PM,NOON和MIDNIGHT”。可以用大写,小写或混合大小写来表示这些后缀。也可以将这些后缀缩写为任意数量的字母。

公认的形式包括:

  • 默认日期格式,MM / DD / [YY] YY
  • 格式DDMmm [YY] YY
  • ODBC格式[YY] YY-MM-DD
  • 格式DD / MM / [YY] YY
  • 格式Mmm D,YYYY
  • 格式 Mmm D YYYY
  • 格式 Mmm DD YY
  • 格式 YYYYMMDD (numeric format)
参数

datetime

想要转换为$HOROLOG格式的日期和时间字符串。可以指定以下任何一项:

  • 该表达式的计算结果为单个字符串,首先是日期,然后是单个空格,然后是时间。
  • 该表达式的计算结果为仅指定日期的字符串。除非tformat为7或8,否则时间值默认为午夜(0),在这种情况下,时间默认为从午夜(0)开始的本地时区偏移量。
  • 字母代码“T”或“t”,用于指定当前日期。可以选择在该字母后跟加号(+)或减号(-),以及一个整数,该整数指定从当前日期开始的天数偏移量。可以在此日期表达式后加上一个空格和一个时间表达式,或者将时间默认设置为午夜(0)。 (如果tformat为7或8,则时间默认为从午夜(0)开始的本地时区偏移。)如果使用此当前日期选项,则必须指定5、6、7、8、9或15的dformat。

有效的日期和时间值取决于当前语言环境的DateFormat和TimeFormat属性以及为dformat和tformat参数指定的值。有关指定日期的详细信息,请参见$ZDATEH。

默认情况下,最早的有效日期时间是1840年12月31日(内部$HOROLOG表示形式为0)。默认情况下,日期限制为正整数,因为DateMinimum属性默认为0。如果当前语言环境的DateMinimum属性设置为更大或等于负整数,则可以将较早的日期指定为负整数。有效的最低DateMinimum值的最低值是-672045,对应于0001年1月1日。Caché使用了多功的格里高利历,将格里高利历回溯到“ Year 1”,符合ISO 8601标准。这在一定程度上是因为公历是在不同国家的不同时间采用的。例如,许多欧洲大陆在1582年采用了它;大不列颠及美国在1752年采用了该日期。因此,在当地采用格里高利历的时间是不早于当时基于当地历法记录的历史日期。有关1840年之前的日期的更多详细信息,请参考mindate参数。

dformat

日期格式。有效值为:

含义
1 MM / DD / [YY] YY(07/01/97或03/27/2002)-美式数字格式。必须为当前语言环境指定正确的DateSeparator字符(/或。)。
2 DD Mmm [YY]YY (01 Jul 97 or 27 Mar 2002)
3 [YY]YY-MM-DD (1997-07-01 or 2002-03-27) - ODBC 格式
4 DD/MM/[YY]YY (01/07/97 or 27/03/2002) 欧洲数字格式。必须为当前语言环境指定正确的DateSeparator字符(/或。)。
5 Mmm [D]D, YYYY (Jul 1, 1997 or Mar 27, 2002)
6 Mmm [D]D YYYY (Jul 1 1997 or Mar 27 2002)
7 Mmm DD [YY]YY (Jul 01 97 or Mar 27 2002)
8 YYYYMMDD (19970701 or 20020327) 数值格式
9 Mmmmm [D]D, YYYY (July 1, 1997 or March 27, 2002)

13 | [D]D/[M]M/YYYY (1/7/2549 or 27/11/2549) 泰文日期格式。除无前导零外,日和月与欧洲用法相同。该年是佛教时代(BE)年,通过在公历年中增加543年而得出。
15 | DD / MM / [YY] YY或YYYY-MM-DD或带任何DateSeparator字符的任何明确的欧洲日期格式,或不带日期分隔符的YYYYMMDD。 DateSeparator字符可以是任何非字母数字字符,包括空格,而不管当前语言环境中指定的DateSeparator字符如何。还接受月列表名称和“T”。有关有效的欧洲日期格式的完整列表,请参见$ZDATEH。
16 | YYYYc[M]Mc[D]Dc —日文日期格式。年,月和日的编号与其他日期格式相同;前导零被省略。在年,月和日编号之后插入“年”,“月”和“日”的日语字符(在此处显示为c)。这些字符是Year = $CHAR(24180),Month = $CHAR(26376)和Day = $CHAR(26085)。
17 | YYYYc [M]Mc [D]Dc —日文日期格式。与dformat 16相同,除了在“ year”和“ month”日语字符之后插入空格。
18 | [D]D Mmmmm YYYY - 具有完整月份名称的表格回历(伊斯兰)日期格式。省略了日期前导零。包括年份前导零。教堂日期-445031(公元07/19/0622)= 1穆罕默德0001。
19 | [D]D [M]M YYYY 带月号的表格回历(伊斯兰)日期格式。日和月的前导零被省略;包括年份前导零。教堂日期-445031(西元07/19/0622)= 1 1 0001。
20 | [D]D Mmmmm YYYY —观察到的回历(伊斯兰)日期格式,并带有完整的月份名称。默认为表格回历(dformat 18)。要覆盖表格计算,请使用%Calendar.Hijri类添加对新月新月的观测。
21 | [D]D [M]M YYYY —观察到的回历(伊斯兰)日期格式和月数。默认为表格回历(dformat 19)。要覆盖表格计算,请使用%Calendar.Hijri类添加对新月新月的观测。
-1 |从用户的语言环境fmt.DateFormat获取有效的dformat值,其中fmt是与当前进程关联的## class(%SYS.NLS.Format)的实例。如果不指定dformat,则这是默认行为。有关更多详细信息,请参见“可自定义的日期和时间默认值”。
-2 |$ZDATETIMEH采用UTC秒的整数计数,并返回相应的本地$HOROLOG日期时间值。这与$ZDATETIME dformat –2相反。有关更多详细信息,请参考$ZDATETIME dformat –2。输入的datetime值是由time()库函数返回的值,如ISO C编程语言标准中所定义。例如,在兼容POSIX的系统上,此值是从1970年1月1日00:00:00 UTC开始的秒数。 tformat,monthlist,yearopt,startwin和endwin参数将被忽略。
-3 |$ZDATETIMEH采用以$ZTIMESTAMP内部格式指定的日期时间值,将该值从UTC世界时转换为本地时间,并以相同的内部格式返回结果值。 tformat,monthlist,yearopt,startwin和endwin参数将被忽略。 $ZDATETIME执行相反的操作。 (当前,此日期转换具有针对tformat值7和8描述的时间转换异常。这可能会影响1970年之前的日期,2038年之后的日期以及本地时变边界天,例如夏时制的开始日期或结束日期。 )。

其中:

语法 含义
YYYY YYYY是四位数的年份。如果日期时间落在两位数日期的活动窗口内,则[YY] YY是两位数的年份;否则,它是一个四位数的数字。
MM 两位数的月份。
D 一天数字的一位数字 < 10。否则为两位数。
DD 两位数的日子
Mmm Mmm是从当前语言环境的MonthAbbr属性中提取的月份缩写。默认值为:“Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec” 或从指定为$ZDATETIMEH的monthlist参数的可选列表中提取的替代月份缩写(或任何长度的名称)。
Mmmmm 由当前语言环境的MonthName属性指定的月份的全名。默认值为:“January February March ... November December”或从指定为$ZDATETIMEH的monthlist参数的可选列表中提取的替代月份名称。

dformat Default

如果省略dformat或将其设置为-1,则dformat的默认值取决于localeopt参数和NLS DateFormat属性:

  • 如果localeopt = 1,则dformat的默认值为ODBC格式。 tformat,monthlist,yearopt,mindate和maxdate参数的默认值也设置为ODBC格式。这与设置dformat = 3相同。
  • 如果localeopt = 0或未指定,则dformat默认值来自NLS DateFormat属性。如果DateFormat = 3,则dformat的默认值为ODBC格式。但是,DateFormat = 3不会影响tformat,monthlist,yearopt,mindate和maxdate参数默认值,这些默认值是在当前NLS语言环境定义中指定的。

若要确定语言环境的默认日期属性,请调用GetFormatItem()NLS类方法:

DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("DateFormat")
1
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("DateSeparator")
/

当dformat = 1或4时,$ZDATETIMEH将使用当前语言环境(/或。)的DateSeparator属性的值作为月,日和年之间的分隔符。

欧洲日期格式(dformat = 4,DD / MM / YYYY顺序)是许多(但不是全部)欧洲语言的默认格式,包括英式英语,法语,德语,意大利语,西班牙语和葡萄牙语(使用“ /”日期分隔符)字符),以及捷克语(csyw),俄语(rusw),斯洛伐克语(skyw),斯洛文尼亚语(svnw)和乌克兰语(ukrw)(使用“。” DateSeparator字符)。

dformat Settings

如果dformat为3(ODBC格式的日期),则ODBC格式的默认值也用于tformat,monthlist,yearopt,mindate和maxdate参数的默认值。当前的语言环境默认值将被忽略。

如果dformat为16或17(日语日期格式),则日期格式与语言环境设置无关。要使用日语格式的日期,必须具有UnicodeCaché实例。在8位Caché实例上,将dformat指定为16或17会导致 <ERWIDECHAR>错误。

如果dformat为18、19、20或21(伊斯兰日期格式)且未指定localeopt,则参数默认为伊斯兰默认值,而不是当前的语言环境默认值。 monthlist参数默认为阿拉伯语月份名称,并用拉丁字符音译。 tformat,yearopt,mindate和maxdate参数默认为ODBC默认值。日期分隔符默认为回教默认值(一个空格),而不是ODBC默认值或当前区域设置的DateSeparator属性值。如果localeopt = 0,则将当前语言环境属性默认值用于这些参数。如果localeopt = 1,则将ODBC默认值用于这些参数。

tformat

一个数字值,指定输入时间值的格式。支持的值如下:

描述
-1 从当前语言环境的TimeFormat属性获取有效的tformat值,默认为1。这是默认行为,如果未为除3之外的所有dformat值指定tformat。
1 以“ hh:mm:ss”的形式指定时间(24小时制)。 dformat = 3时,这是默认设置。
2 以“ hh:mm”的形式指定时间(24小时制)
3 以“ hh:mm:ss [AM / PM]”的形式指定时间(12小时制)
4 以“ hh:mm [AM / PM]”的形式指定时间(12小时制)
5 以“ hh:mm:ss +/- hh:mm”的形式指定时间(24小时制)。时间指定为当地时间。可以提供以下可选后缀,但将其忽略:加(+)或减(–)后缀,后跟本地时间与协调世界时(UTC)的偏移量。减号(-hh:mm)表示本地时间早于格林威治子午线(向西)乘以返回的小时和分钟偏移量。加号(+ hh:mm)表示本地时间晚于格林威治子午线(向东),返回的时差为小时和分钟。
6 以“ hh:mm +/- hh:mm”的形式指定时间(24小时制)。时间指定为当地时间。可以提供以下可选后缀,但将其忽略:加(+)或减(–)后缀,后跟本地时间与协调世界时(UTC)的偏移量。减号(-hh:mm)表示本地时间早于格林威治子午线(向西)乘以返回的小时和分钟偏移量。加号(+ hh:mm)表示本地时间晚于格林威治子午线(向东),返回的时差为小时和分钟。
7 以“ hh:mm:ssZ”的形式指定时间(24小时制)。时间必须指定为世界标准时间(UTC)。可以提供或省略可选的“ Z”后缀,但将其忽略。此后缀仅表示假定时间为协调世界时(UTC),而不是本地时间。
8 以“ hh:mm:ssZ”的形式指定时间(24小时制)。时间必须指定为世界标准时间(UTC)。可以提供或省略可选的“ Z”后缀,但将其忽略。此后缀仅表示假定时间为协调世界时(UTC),而不是本地时间。

如果datetime字符串同时包含日期部分和时间部分,则该时间部分与日期部分之间用单个空格或大写字母“ T”分隔。如果存在时间部分:

  • 时间格式1到6假定datetime使用与结果相同的时区指定本地时间。

  • 时间格式7和8假设datetime指定UTC时间;这些格式将日期和时间都转换为系统本地时间。

对于5到8的时间格式,日期时间值后可以跟一个后缀,该后缀由大写字母“Z”或以“+”或“-”开头的UTC偏移量组成。后缀的存在不影响时区转换。

注意:涉及dformat值-2和-3以及tformat值7和8以及由tformat值5和6生成的UTC偏移的转换具有以下与平台有关的异常:

  • 在不同的操作系统平台上,本地时变边界行为可能有所不同。当本地时间变化发生并且本地时钟向后移动时(夏令时结束时“ Fall back”),将重复本地时间小时。在这两个小时的时间内,Caché时间转换操作无法确定是将其应用于该本地时间的第一次出现,还是应用于同一小时的第二次出现。 $ZDATETIME使用平台特定的运行时库使用的任何假设。因此,在此时间窗口内,不同的操作系统平台可能会给出不同的时间转换结果。

Caché使用操作系统平台支持的所有日期的标准时间偏移来执行本地时间和UTC时间之间的转换。

如果指定的日期早于平台支持的最早日期,则Caché使用标准时间偏移1902–01–01(如果平台支持此日期)。如果平台不支持日期1902-01-01,则Caché使用1970-01-01的标准时间偏移。任何本地时变偏移量(例如夏令时)都将被忽略。

如果指定日期晚于平台支持的最新日期,则Caché会计算2010–01–01至2037–12–31范围内的对应日期,并使用该对应日期的标准时间偏移。该算法应为2100-02-28年之内的日期提供准确的时间偏移,前提是有关日期/时间遵守的法律将来没有变化。

若要确定语言环境的默认时间格式,请调用GetFormatItem()NLS类方法:

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("TimeFormat")
1

12–hour Clock (tformat 3 and 4)

在12小时制的时钟格式中,早上和晚上指定了时间后缀,此处显示为AM和PM。若要确定语言环境的默认时间后缀,请调用GetFormatItem()NLS类方法,如下所示:

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("AM")
AM
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("PM")
PM

对于除3、18、19、20和21以外的所有dformat值,AM和PM属性默认为当前区域设置定义。对于dformat = 3(ODBC日期格式)和dformat = 18、19、20或21(伊斯兰日期格式),无论当前语言环境属性值如何,时间后缀始终为“ AM”和“ PM”。除日语语言环境jpww之外,所有语言环境的AM和PM属性默认值为“ AM”和“ PM”。

默认情况下,除日语语言环境(jpnw,jpuw,jpww,zdsw,zdtw,zduw),葡萄牙语(ptbw),俄语(rusw)和乌克兰语(ukrw)外,所有其他语言环境的Midnight和Noon均表示为“ MIDNIGHT”和“ NOON” )。但是,当dformat = 3时,$ZDATETIMEH始终使用ODBC标准值,而不管语言环境的默认设置如何。

monthlist

该表达式可解析为月份名称或月份名称缩写的字符串,以分隔符分隔。 monthlist中的名称替换了来自当前语言环境的MonthAbbr属性的默认月份缩写值或来自MonthName属性的月份名称值。

仅当dformat为2、5、6、7、9、15、18或20时,monthlist才有效。如果dformat为任何其他值,则$ZDATETIMEH忽略monthlist。

月列表字符串具有以下格式:

  • 字符串的第一个字符是定界符(通常为空格)。同一分隔符必须出现在月份列表的第一个月份名称之前和每个月份名称之间。可以指定任何单字符定界符;必须在指定的日期时间值的月,日和年部分之间指定此定界符,这就是为什么通常使用空格作为首选字符的原因。

  • 月份名称字符串应包含十二个分隔值,分别对应于一月到十二月。可以指定多于或少于十二个月的名称,但是如果在日期时间中没有对应于月份的月份名称,则会生成<ILLEGAL VALUE>错误。

如果省略monthlist或将monthlist的值指定为-1,则$ZDATETIMEH使用在当前语言环境的MonthAbbr或MonthName属性中定义的月份名称列表,除非满足以下条件之一:如果localeopt = 1,则月份列表默认值为ODBC月列表(英文)。如果未指定localeopt且dformat为18或20(伊斯兰日期格式),则月列表默认值为伊斯兰月份列表(使用拉丁字母表示的阿拉伯名称),忽略MonthAbbr或MonthName属性值。

若要确定语言环境的默认月份名称和月份缩写,请调用GetFormatItem()NLS类方法:

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthAbbr"),!
 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
 
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthName"),!
 January February March April May June July August September October November December

yearopt

使用dformat值0、1、2、4或7,这是一个数字代码,用于指定将年份显示为两位数值的时间窗口。 yearopt可以是:

描述
-1 从当前语言环境的YearOption属性获取有效的yearopt值,该值默认为0。如果未指定yearopt,则这是默认行为。
0 除非有特定于过程的滑动窗口(通过%DATE实用程序建立),否则用两位数字表示20世纪的日期(1900年至1999年)。如果这样的窗口有效,请仅将落在滑动窗口中的那些日期表示为两位数年份。用20位数字表示所有20世纪以外或特定于过程的滑动窗口之外的日期。
1 代表20世纪的日期用两位数的年份表示,其他所有日期用4位数的年份表示。
2 用两位年份表示所有日期。
3 这些日期用两位数的年份表示由startwin和(可选)endwin定义的滑动时间范围内的日期。用四位数字的年份表示所有其他日期。当yearopt = 3时,startwin和endwin是$HOROLOG格式的绝对日期。
4 用四位数年份表示所有日期。
5 所有日期都用两位数的年份表示,这些日期都落在startwin和(可选)endwin定义的滑动窗口内。用四位数字的年份表示所有其他日期。当yearopt = 5时,startwin和endwin是相对年份。
6 用两位数字年份代表当前世纪的所有日期,而用四位数年份代表所有其他日期。

如果省略yearopt或将yearopt值指定为-1,则$ZDATETIMEH使用当前语言环境的YearOption属性,除非满足以下条件之一:如果localeopt = 1,则yearopt默认为ODBC year选项。如果localeopt = 0或未指定,并且dformat是18、19、20或21(伊斯兰日期格式),则yearopt的默认值为ODBC year选项(4位数字的年份);否则,默认值为ODBC年。回教日期将忽略YearOption属性值。

startwin

一个数字值,指定滑动窗口的开始,在此期间,日期必须用两位数的年份表示。当使用的yearopt为3或5时,必须提供startwin。startwin不适用于任何其他yearopt值。

当yearopt = 3时,startwin是$HOROLOG日期格式的绝对日期,指示滑动窗口的开始日期。

从当前语言环境的YearOption属性获取有效的yearopt值,该值默认为0。如果未指定yearopt,则这是默认行为。

endwin

一个数字值,指定滑动窗口的结束,在此期间内,日期用两位数的年份表示。当yearopt为3或5时,可以选择提供endwin。endwin不适用于任何其他yearopt值。

当yearopt = 3时,endwin是$HOROLOG日期格式的绝对日期,指示滑动窗口的结束日期。

当yearopt = 5时,endwin是一个数字值,表示滑动窗口的结束年份,表示为当前年份之后的年数。滑动窗口始终在endwin中指定的当年12月31日结束。如果未指定endwin,则默认为startwin后100年的12月31日。

如果省略endwin(或指定为-1),则有效滑动窗口将为100年。 endwin值为-1是一种特殊情况,即使较高和较低endwin值返回错误,也总是返回日期值。因此,最好在指定100年窗口时省略endwin,并避免使用负endwin值。

如果同时提供startwin和endwin,则它们指定的滑动窗口的持续时间不得超过100年。

mindate

该表达式指定有效日期范围的下限(含)。可以指定为$HOROLOG整数日期计数(例如,2013年1月1日表示为62823)或$HOROLOG字符串值。可以包括或忽略$HOROLOG日期的时间部分(例如“62823,43200”),但仅解析主意的日期部分。如果早于mindate指定hdatetime值,则会产生<VALUE OUT OF RANGE>错误。

以下是受支持的提示值:

  • 正整数:最常见的正念指定为正整数,以建立最早的允许日期为1840年12月31日之后的某个日期。例如,正念21550会将最早的允许日期建立为1900年1月1日。最高有效值是2980013(9999年12月31日)。
  • 0:指定最小日期为1840年12月31日。这是DateMinimum属性的默认值。
  • 负整数-2或更大:指定从1840年12月31日开始倒数的最小日期。例如,记号-14974将建立最早的允许日期为1800年1月1日。负记号值仅在DateMinimum属性为时才有意义。当前语言环境已设置为等于或大于负数。最低有效值为-672045。
  • 如果省略(或指定为-1),则mindate默认为当前语言环境的DateMinimum属性值,除非以下条件之一为真:如果localeopt = 1,则minindate默认值为0。如果localeopt未指定且dformat = 3,预设值是0。如果未指定localeopt并且dformat是18、19、20或21(伊斯兰日期格式),则预设值是0。

可以获取并设置DateMinimum属性,如下所示:

/// d ##class(PHA.TEST.Function).ZDATETIMEH()
ClassMethod ZDATETIMEH()
{
	SET min=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
	WRITE "initial DateMinimum value is ",min,!
Permit18thCenturyDates
	SET x=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-51498)
	SET newmin=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
	WRITE "set DateMinimum value is ",newmin,!!
RestrictTo19thCenturyDates
	WRITE $ZDATETIMEH("05/29/1805 12:00:00",1,,,,,,-14974),!!
ResetDateMinimumToDefault
	SET oldmin=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",min)
	WRITE "reset DateMinimum value from ",oldmin," to ",min
}

d ##class(PHA.TEST.Function).ZDATETIMEH()
initial DateMinimum value is 0
set DateMinimum value is -51498

-13000,43200

reset DateMinimum value from -51498 to 0

可以指定有或没有maxdate的提示。指定大于maxdate的提示时,会产生<ILLEGAL VALUE>错误。

maxdate

该表达式指定有效日期范围的上限(含)。可以指定为$HOROLOG整数日期计数(例如1/1/2100表示为94599)或$HOROLOG字符串值。可以包括或省略$HOROLOG日期的时间部分(例如“94599,43200”),但仅会解析maxdate的日期部分。

如果省略maxdate或将其指定为-1,则最大日期限制是从当前语言环境的DateMaximum属性获取的,该属性默认为$HOROLOG日期部分的最大允许值:2980013(对应于9999年12月31日) 。但是,DateMaximum属性的应用由localeopt设置控制。当localeopt = 1(dformat = 3的默认值)时,最大的默认日期是ODBC值(2980013),与当前的语言环境设置无关。回教日期格式也采用ODBC默认值。泰文日期格式(dformat = 13)的最大日期为BE 31/12/9999,对应于$HOROLOG 2781687。

指定大于maxdate的datetime会产生<VALUE OUT OF RANGE>错误。

如果指定的最大日期大于2980013,则会产生<ILLEGAL VALUE>错误。

可以指定maxdate或不指定。指定的maxdate小于mindate会生成<ILLEGAL VALUE>错误。

erropt

为该参数指定值将抑制与无效或超出范围的日期时间值相关的<ILLEGAL VALUE> or <VALUE OUT OF RANGE> 错误。 $ZDATETIMEH函数将返回错误值,而不是生成或错误。

Caché在日期时间执行标准的数字计算,该计算必须评估在mindate / maxdate范围内的整数日期。因此,7,“ 7”,+ 7、0007、7.0,“ 7a draw”和--7的值均等于同一日期值:01/07/1841。默认情况下,大于2980013或小于0的值会生成<VALUE OUT OF RANGE>错误。分数值会产生<VALUE OUT OF RANGE>错误。非数字字符串(包括空字符串)的值为0,因此返回$HOROLOG初始日期:12/31/1840。

erropt参数仅抑制由于无效或超出日期时间范围值而生成的错误。无论是否提供错误提示,由于其他参数无效或超出范围而产生的错误将始终产生错误。例如,当$ZDATETIMEH指定一个滑动窗口,其中endwin早于startwin时,总是生成<ILLEGAL VALUE>错误。同样,当maxdate小于mindate时,会生成错误。

localeopt

此布尔值参数将用户的当前语言环境定义或ODBC语言环境定义指定为语言环境指定的参数dformat,tformat,monthlist,yearopt,minate和maxdate的默认值的来源:

  • 如果localeopt = 0,则所有这些参数均采用当前的语言环境定义默认值。
  • 如果localeopt = 1,则所有这些参数均采用ODBC默认值。
  • 如果未指定localeopt,则dformat参数确定这些参数的默认值。如果dformat = 3,则使用ODBC默认值。如果dformat为18、19、20或21,则无论当前语言环境定义如何,都使用回教日期和时间格式默认值。对于所有其他dformat值,使用当前的语言环境定义默认值。有关更多详细信息,请参考dformat描述。

不能更改ODBC标准语言环境。它用于格式化日期和时间字符串,这些日期和时间字符串在做出了不同的国家语言支持(NLS)选择的Caché流程之间可移植。 ODBC语言环境日期和时间定义如下:

  • 日期格式默认为3。因此,如果dformat未定义或为-1,则使用日期格式3。
  • 日期分隔符默认为“/”。但是,日期格式默认为3,该格式始终使用“-”作为日期分隔符。
  • Year选项默认为4位数字。
  • 最小和最大日期:0和2980013($HOROLOG日期计数)。
  • 使用英语月份的名称,月份的缩写,工作日的名称,工作日的缩写以及单词“ Noon”和“ Midnight”。
  • 时间格式默认为1。时间分隔符为“:”。时间精度为0(无小数秒)。 AM和PM指示器分别为“ AM”和“ PM”。
注意

$ZDATETIMEH和小数秒

与$ZDATETIME不同,$ZDATETIMEH不允许指定时间的精度。原始$ZDATETIME格式的时间中的任何小数秒都保留在$ZDATETIMEH返回的值中。

请注意,$HOROLOG不返回小数秒。

$ZDATETIMEH的值无效

在以下情况下,收到<FUNCTION> 错误:

  • 如果指定了无效的dformat代码(无效的整数值或非整数值)。

  • 如果为tformat指定了无效值(小于-1或大于8的整数值,零或非整数值)。
    0 如果yearopt为3或5,则不指定startwin值。
    在以下情况下,会收到<ILLEGAL VALUE>错误:

  • 如果为任何日期/时间单位指定了无效值。如果指定,则返回错误值,而不是发出<ILLEGAL VALUE>。

  • 如果为ODBC日期中的任何日期/时间单位指定多余的前导零。例如,可以将2007年2月3日表示为“ 2007–2–3”或“ 2007–02–03”,但会收到“ 2007–002–03”的。如果指定,则返回错误值,而不是发出<ILLEGAL VALUE>。

  • 如果给定的月份数大于monthlist中的月份数。

  • 如果maxdate小于主意。

  • 如果endwin小于startwin。

  • 如果startwin和endwin指定滑动时间窗口,其持续时间大于100年。

在以下情况下,收到<VALUE OUT OF RANGE>错误:

  • 如果指定的日期(或“ T”的偏移量)早于1840年12月31日或晚于9999年12月31日,并且不提供错误值。
  • 如果指定了其他有效日期(或“ T”的偏移量),该日期超出了mindate和maxdate的范围,并且不提供错误的值。

当前日期

以下示例显示了如何使用“ T”或“ t”字母代码指定当前日期。请注意,dformat必须为5、6、7、8、9或15。

当前日期,时间默认为0:

DHC-APP> WRITE $ZDATETIMEH("T",5)
65698,0

当前日期前三天,时间默认为0:

DHC-APP>WRITE $ZDATETIMEH("T-3",5)
65695,0

当前日期之后的两天,带有指定的时间:

DHC-APP>WRITE $ZDATETIMEH("T+2 11:45:00",5)
65700,42300

$ZDATETIMEH与$ZDATEH相比

$ZDATETIMEH与$ZDATEH相似,除了它将日期和时间值都转换为内部$HOROLOG格式(即使未指定时间值也是如此)。$ZDATEH仅将日期值转换为$HOROLOG格式。例如:

DHC-APP>WRITE $ZDATEH("Nov 25, 2002",5)
59133
DHC-APP>  WRITE $ZDATETIMEH("Nov 25, 2002 10:08:09.539",5)
59133,36489.539

指定没有时间值的$ZDATETIMEH:

DHC-APP> WRITE $ZDATETIMEH("Nov 25, 2002",5)
59133,0

指定不带时间值的$ZDATETIMEH,格式为7或8:

DHC-APP>WRITE $ZDATETIMEH("Nov 25, 2002",5,7)
59133,28800

返回值,例如:59133,68400,其中时间值是从午夜开始的本地时区偏移量。在这种情况下,美国东部标准时间比UTC偏移5小时,因此此处的时间值表示19:00(与午夜偏移5小时)。