第三章 疯狂Caché 数据类型和值

第三章 Caché 数据类型和值

CachéObjectScript是一种无类型语言。不必声明变量的类型。任何变量都可以有字符串、数值或对象值。

String 字符串

字符串是一组字符:字母、数字、标点符号等,由一组匹配的引号("")分隔:

 SET string = "This is a string"
 WRITE string
This is a string

转义引号

通过在字符串前面加上另一个双引号字符,可以将(双引号)字符作为文字包含在字符串中:

 SET string = "This string has ""quotes"" in it."
 WRITE string
This string has "quotes" in it.

ObjectScript字符串文字中没有其他转义字符序列。

连接字符串

可以使用_连接运算符将两个字符串连接成单个字符串:

 SET a = "Inter"
 SET b = "Systems"
 SET string = a_b
 WRITE string
InterSystems

过使用连接运算符,可以在字符串中包含非打印字符。以下字符串包括换行符($CHAR(10))

 SET lf = $CHAR(10)
 SET string = "This"_lf_"is"_lf_"a string"
 WRITE string
This
is
a string

注:非打印字符的显示方式由显示设备决定。例如,Caché终端与换行符和其他定位字符的浏览器显示不同。此外,不同的浏览器显示定位字符$CHAR(11)$CHAR(12)的方式也不同。

Caché编码字符串(位字符串、列表结构字符串和JSON字符串)在使用连接运算符方面有限制。

字符串比较

可以使用等于(=)和不等于(‘=)运算符来比较两个字符串。字符串相等比较区分大小写。使用这些运算符比较字符串和数字时要小心,因为此比较是字符串比较,而不是数字比较。因此,只有包含规范形式的数字的字符串才等于其相应的数字。(“-0”不是规范数字。)

下面的示例显示了这一点:

  WRITE "Fred" = "Fred",!  // TRUE
  WRITE "Fred" = "FRED",!  // FALSE
  WRITE "-7" = -007.0,!    // TRUE
  WRITE "-007.0" = -7,!    // FALSE
  WRITE "0" = -0,!         // TRUE
  WRITE "-0" = 0,!         // FALSE
  WRITE "-0" = -0,!        // FALSE
1
0
1
0
1
0
0

<、>、<=或>=运算符不能用于执行字符串比较。这些运算符将字符串视为数字,并始终执行数字比较。使用这些运算符进行比较时,将为任何非数字字符串分配数值0。

字母和字符串比较

字符串相等比较区分大小写。可以使用$ZCONVERT函数将字符串中的字母转换为全部大写字母或全部小写字母进行比较。非字母字符保持不变。

有几个字母只有小写字母形式。例如,德语eszett($CHAR(223))仅定义为小写字母。将其转换为大写字母会产生相同的小写字母。因此,在将字母数字字符串转换为单字母大小写时,最好始终转换为小写。

长字符串

Caché支持两个最大字符串长度选项:

  • 传统的最大字符串长度为32,767个字符。
  • Long String最大字符串长度为3,641,144个字符。
    默认情况下启用长字符串。如果启用了长字符串,则字符串的最大长度为3,641,144个字符。如果禁用长字符串,则字符串的最大长度为32,767个字符。

超过当前最大字符串长度会导致错误。

可以通过调用MaxLocalLength()方法返回当前系统范围内的最大字符串长度,如下所示:

   WRITE $SYSTEM.SYS.MaxLocalLength()
3641144

可以使用以下任何操作在系统范围内启用或禁用长字符串:

  • 在管理门户中(Management Portal),选择[Home] > [Configuration] > [Memory and Startup].在“系统内存和启动设置 System Memory and Startup Settings ”页上,选中“启用长字符串 Enable Long Strings”复选框。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnjBscQV-1588812301535)(F06D88F11676447595537BC86A100C02)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lWtvXDFK-1588812301538)(5B756175BE604ADB83F3E204402004AF)]

在Caché参数文件(cpf文件)中,指定EnableLongStrings参数的值,如caché参数文件参考的EnableLongStrings部分所述。

在Config.Miscellous类属性中,指定EnableLongStrings布尔值。这将修改相应的CPF文件参数。例如:

  ZNSPACE "%SYS"
  SET getstat=##class(Config.Miscellaneous).Get(.Properties)
    IF getstat '= 1 {WRITE "Get config property error",! QUIT}
  SET Properties("EnableLongStrings")=0
  SET modstat=##class(Config.Miscellaneous).Modify(.Properties)
    IF modstat '= 1 {WRITE "Modify config property error",! QUIT}

当进程实际使用长字符串时,该字符串的内存来自操作系统的malloc()缓冲区,而不是该进程的分区内存空间。因此,分配给实际长字符串值的内存不受每个进程的最大内存(Maximum Per Process Memory(KB))参数设置的限制,也不影响进程的$STORAGE值。

位字符串 Bit Strings

位串表示具有布尔值的编号位的逻辑集合。字符串中的位从位号1开始编号。任何未显式设置为布尔值1的编号位的计算结果为0。因此,引用显式设置之外的任何编号位都会返回位值0。这些位的布尔状态只能使用位串函数$BIT$BITLOGIC设置或访问。

位串具有逻辑长度,它是显式设置为0或1的最高位位置。此逻辑长度只能使用$BITCOUNT函数访问,通常不应在应用程序逻辑中使用。对于位串函数,未定义的全局或局部变量等效于具有任何指定编号的位返回位值0和$BITCOUNT值0的位串。

位串被存储为具有内部格式的普通 Caché 串。此内部字符串表示不能通过位串函数访问。由于这种内部格式,位串的字符串长度对于确定字符串中的位数没有任何意义。

处于相同状态(具有相同布尔值)的两个位串可能具有不同的内部字符串表示形式,因此不应在应用程序逻辑中检查或比较字符串表示形式。

由于位串的内部格式,不能将串联运算符与位串一起使用。这样做会导致<Invalid bit string>错误。

在事务回滚之后,在事务期间全局变量中设置的位将恢复为其先前的值。回滚不会将全局变量位字符串返回到其先前的字符串长度或先前的内部字符串表示形式。回滚操作不会还原局部变量。

Numbers 数字

数的基本原理

数字文字不需要任何括起的标点符号。以使用任何有效的数字字符指定数字。Caché将一个数字计算为语法有效,然后将其转换为规范形式。

数值型文字的语法要求如下:

  • 它可以包含从0到9的十进制数字,并且必须至少包含这些数字字符中的一个。它可以包含前加零或尾随零。
  • 它可以包含任意顺序的任意数量的前导加号和减号。但是,加号或减号不能出现在除“E”科学记数法字符之外的任何其他字符之后。在数字表达式中,非符号字符后的符号作为加法或减法运算计算。在数字字符串中,非符号字符后的符号被计算为非数字字符,从而终止字符串的数字部分。

Caché使用当前区域设置的PlusSign和MinusSign属性值来确定这些符号字符(默认情况下为“+”和“-”);这些符号字符取决于区域设置。要确定区域设置的PlusSign和MinusSign字符,请调用GetFormatItem()方法:

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),!
  WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
+
-
  • 它最多可以包含一个小数分隔符。在数字表达式中,第二个小数分隔符会导致错误。在数字字符串中,第二个小数分隔符被计算为第一个非数字字符,从而终止字符串的数字部分。小数分隔符字符可以是数字表达式的第一个字符或最后一个字符。小数分隔符的选择取决于区域设置:美国格式使用句点(.)。作为小数分隔符,这是默认设置。欧洲格式使用逗号(,)作为小数分隔符。若要确定区域设置的DecimalSeparator字符,请调用GetFormatItem()方法:
 WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
  • 它最多可以包含一个字母“E”(或“e”)来指定科学记数法的基数为10的指数。此科学记数法字符(“E”或“e”)前面必须是整数或小数,后面必须是整数。

数字文字值不支持以下内容:

  • 不能包含数字组分隔符。它们依赖于区域设置:美国格式使用逗号,欧洲格式使用句点。可以使用 i N u m b e r 使 iNumber函数删除数字组分隔符,使用` FNUMBER`函数添加数字组分隔符。

  • 不能包含货币符号、十六进制字母或其他非数字字符。不能包含空格,算术运算符之前或之后除外。

  • 不能包含尾随的加号或减号。但是,$FNUMBER函数可以将数字显示为带有尾随符号的字符串,而$NUMBER函数可以采用此格式的字符串并将其转换为带有前导符号的数字。

  • 不能指定括号来将数字表示为负数。但是,$FNUMBER函数可以将负数显示为带圆括号的字符串,$NUMBER函数可以接受此格式的字符串,并将其转换为带有前导负号的数字。

数字或数字表达式可以包含成对的括号。这些括号不是数字的一部分,但控制运算的优先顺序。默认情况下,Caché严格按照从左到右的顺序执行所有操作。

数的标准型

当Caché将数字转换为规范形式时,它会执行以下操作:

  • 指数已解析。
  • 主要符号已经解决。首先,将多个符号解析为单个符号(例如,将两个减号解析为一个加号)。然后,如果前导符号是加号,则将其删除。
  • 所有前导零和尾随零都将被删除。这包括从分数中删除整数零;例如,0.66变为 .66。可以使用 F N U M B E R FNUMBER或 JUSTIFY函数恢复整数零:.66变为0.66。
  • 删除尾随小数分隔符。
  • -0转换为0。

数字形式的字符串

以下是将字符串作为数字处理的一般规则。

  • 对于所有数值运算,包含规范形式的数字的字符串在功能上与相应的数字相同。例如,“3”=3“-2.5”=-2.5。(请注意,-0不是规范数字。)
  • 对于算术运算,仅包含非规范形式的数字字符的字符串在功能上与相应的数字相同。例如,“003”+3=6“++-2.5000”+-2.5=-5
  • 对于大于/小于运算,仅包含非规范形式的数字字符的字符串在功能上与相应的数字相同。例如,以下语句为真:“003”>2“++-2.5000”>=-2.5.
  • 对于相等运算(=、‘=),仅包含非规范形式的数字字符的字符串将被视为字符串,而不是数字。例如,以下语句为真:"003" = "003", "003" '= 3, "+003" '= "003".

有关将字符串解析为数字的更多准则:

混合数字字符串是以数字字符开头,后跟一个或多个非数字字符的字符串。比如“7 dwarves”。Caché数值和布尔运算(等式运算除外)通常将此字符串解析为具有数值0(零),直到它们遇到非数字字符。此时,字符串的其余部分将被忽略。以下示例显示对混合数字字符串的算术运算:

  WRITE "7dwarves" + 2,!   // returns 9
  WRITE "+24/7" + 2,!      // returns 26
  WRITE "7,000" + 2,!      // returns 9
  WRITE "7.0.99" + 2,!     // returns 9
  WRITE "7.5.99" + 2,!     // returns 9.5
9
26
9
9
9.5

非数字字符串是在遇到数字字符之前遇到非数字字符的任何字符串。请注意,空格被视为非数字字符。Caché数值和布尔运算(等式运算除外)通常将此字符串解析为具有数值0(零)。以下示例显示了强制相等运算的数字计算的加号:

  WRITE +"7" = 7,!            // returns 1 (TRUE)
  WRITE +"+007" = 7,!         // returns 1 (TRUE)
  WRITE +"7 dwarves" = 7,!    // returns 1 (TRUE)
  WRITE +"dwarves" = 0,!      // returns 1 (TRUE)
  WRITE +"" = 0,!             // returns 1 (TRUE)
1
1
1
1
1

连接数字

可以使用连接运算符(_)将一个数字连接到另一个数字。Caché首先将每个数字转换为其规范形式,然后对结果执行字符串连接。因此,以下全部结果为1234: 12_34, 12_+34, 12_--34, 12.0_34, 12_0034.0, 12E0_34. 串联12._34得到1234,但是串联12_.34得到12.34。连接12_-34得到字符串12-34”

小数

Caché支持小数的两种不同表示形式:

  • 默认情况下,Caché使用自己的浮点标准($decimal number)表示小数。这是大多数用途的首选格式。它提供最高级别的精度-18位十进制数字。它在Caché支持的所有系统平台上都是一致的。

  • IEEE双精度浮点标准是表示小数的行业标准方式。IEEE浮点数使用二进制表示法进行编码。
    它们的精度为53个二进制位,相当于15.95个十进制数字的精度。(请注意,二进制表示法并不完全对应于十进制分数。) 由于大多数小数不能用此二进制记数法精确表示,因此IEEE浮点数可能与相应的标准Caché浮点数略有不同。当IEEE浮点数显示为小数时,二进制位通常被转换为具有远远多于18个十进制位的小数。这并不意味着IEEE浮点数比标准Caché小数更精确。IEEE浮点数能够表示比标准Caché数大和小的数字,并且支持特殊值INF(无穷大)和NaN(非数字)。

可以使用$DOUBLE函数将Caché标准浮点数转换为IEEE浮点数。可以使用$DECIMAL函数将IEEE浮点数转换为Caché标准浮点数。

默认情况下,Caché将小数转换为规范形式,消除所有前导零。因此,0.66变成了.66。$FNUMBER(大多数格式)和$JUSTIFY(3参数格式)始终返回至少包含一个整数位的小数;使用这两个函数之一,.66变为0.66。

DHC-APP>w $fn(-1/1.5,"N")
-0.6666666666666666667
DHC-APP>w $fn(1/1.5,"N")
0.6666666666666666667

$FNUMBER$JUSTUST可用于将数字舍入或填充到指定的小数位数。Caché四舍五入。填充根据需要添加零作为小数位。将小数舍入为整数时,将删除小数分隔符。将整数补零到小数时会添加小数分隔符。

科学记数法

要在CachéObjectScript中指定科学记数法,请使用以下格式:

[-]mantissaE[-]exponent 
  • “-” 可选-一个或多个一元减号或一元加号运算符。这些PlusSign和MinusSign字符是可配置的。
  • mantissa 整数或小数。可以包含前导或尾随小数分隔符。
  • E 指数的运算符。大写的“E”是标准的指数运算符;小写的“e”是可配置的指数运算符,使用%SYSTEM.Process类的Science Notation()方法。
  • “-” 可选-单个一元减号或一元加号运算符。可用于指定负指数。这些PlusSign和MinusSign字符是可配置的。
  • exponent 指定指数(10的幂)的整数。不能包含小数分隔符。

例如,要表示10,请使用1E1。要表示2800,请使用2.8E3。要表示0.05,请使用5e-2。

“E”运算符前面必须是数字字符或小数点,后面必须是整数,或者是单个加号或减号,然后是整数。它后面不能跟小数点、多个加号或减号或小数。允许使用前导零。不允许使用空格。

极大数字

可以精确表示的最大整数是19位整数-9223372036854775808和9223372036854775807。这是因为这些是可以用64个带符号位表示的最大数字。

大于此值的整数会自动四舍五入以适应此64位限制。下面的示例显示了这一点:

  SET x=9223372036854775807
  WRITE x,!
  SET y=x+1
  WRITE y
9223372036854775807
9223372036854775810

类似地,大于128的指数也可导致舍入以允许在64个带符号位内表示。下面的示例显示了这一点:

  WRITE 9223372036854775807e-128,!
  WRITE 9223372036854775807e-129
.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009223372036854775807
.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000922337203685477581

由于这种四舍五入,产生大于这些19位整数的数字的算术运算将其低位数字替换为零。这可能会导致以下情况:

  SET longnum=9223372036854775790
  WRITE longnum,!
  SET add17=longnum+17
  SET add21=longnum+21
  SET add24=longnum+24
  WRITE add17,!,add24,!,add21,!
  IF add24=add21 {WRITE "adding 21 same as adding 24"}

9223372036854775790
9223372036854775807
9223372036854775810
9223372036854775810
adding 21 same as adding 24

除了19位的舍入之外,大于308或309位的整数还会导致<MAXNUMBER>错误。取整行为也会在146或147位发生变化,具体取决于整数。

以下示例显示了这一点:

DHC-APP>d ##class(PHA.TEST.ObjectScript).TestExtremelyLargeNumbersLevel()
2 digits = 11
3 digits = 111
4 digits = 1111
5 digits = 11111
6 digits = 111111
7 digits = 1111111
8 digits = 11111111
9 digits = 111111111
10 digits = 1111111111
11 digits = 11111111111
12 digits = 111111111111
13 digits = 1111111111111
14 digits = 11111111111111
15 digits = 111111111111111
16 digits = 1111111111111111
17 digits = 11111111111111111
18 digits = 111111111111111111
19 digits = 1111111111111111111
20 digits = 11111111111111111110
21 digits = 111111111111111111100
22 digits = 1111111111111111111000
23 digits = 11111111111111111110000
...
146 digits = 11111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
147 digits = 111111111111111101270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
148 digits = 1111111111111111145800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
149 digits = 11111111111111111813000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
...
309 digits = 111111111111111116760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
310 digits = In the CATCH block
System exception
Name: &lt;MAXNUMBER&gt;
Location: zTestExtremelyLargeNumbersLevel+3^PHA.TEST.ObjectScript.1
Code: 1
Data:

可以将长度超过309位的数字表示为数字字符串。由于此值存储为字符串而不是数字,因此舍入和<MAXNUMBER>错误都不适用:

 SET a="1"
  FOR i=1:1:360 {SET a=a_"1" WRITE i+1," characters = ",a,! }

会导致数字的位数超过允许的最大位数的指数会生成<MAXNUMBER>错误。允许的最大指数取决于接收指数的数字的大小。对于一位尾数,最大指数是307或308。

对象

对象值引用内存中对象的实例。可以将对象引用(OREF)分配给任何局部变量:

  ZNSPACE "SAMPLES"
  SET myperson = ##class(Sample.Person).%New()
  WRITE myperson
[email protected]

要引用对象实例的方法和属性,请使用点语法:

 SET myperson.Name = YaoXin"

要确定变量是否包含对象,请使用$ISOBJECT函数

 SET str = "A string" 
 SET myperson = ##class(Sample.Person).%New()

 IF $ISOBJECT(myperson) {
     WRITE "myperson is an object.",!
 } ELSE {
     WRITE "myperson is not an object."
 }
 
 IF $ISOBJECT(str) {
      WRITE "str is an object."
 } ELSE {
     WRITE "str is not an object."
 }
myperson is an object.
str is not an object.

不能将对象值分配给全局变量。这样做会导致运行时错误。

将对象值赋给变量(或对象属性)会产生增加对象的内部引用计数的副作用,如下例所示:

  SET x = ##class(Sample.Person).%New()
  WRITE x,!
  SET y = ##class(Sample.Person).%New()
  WRITE y,!
  SET z = ##class(Sample.Person).%New()
  WRITE z,!
6@Sample.Person
7@Sample.Person
8@Sample.Person

当对对象的引用数量达到0时,Caché会自动销毁该对象(调用其%OnClose()方法并将其从内存中移除)。

未定义的值

ObjectScript变量不需要显式声明或定义。一旦为变量赋值,就会定义该变量。在第一次赋值之前,对此变量的所有引用都是未定义的。可以使用$DATA函数来确定变量是定义的还是未定义的。

$DATA接受一个或两个参数。只需一个参数,它就可以简单地测试变量是否有值:

 WRITE "Does ""MyVar"" exist?",! 
 IF $DATA(MyVar) {     
         WRITE "It sure does!"  
 } ELSE {      
         WRITE "It sure doesn't!"
 }   
     
 SET MyVar = 10  
 WRITE !,!,"How about now?",! 
 IF $DATA(MyVar) {
        WRITE "It sure does!" 
 } ELSE {
        WRITE "It sure doesn't!"
 }

Does "MyVar" exist?
It sure doesn't!

How about now?
It sure does!

$DATA返回一个布尔值,如果变量有值(即包含数据),则布尔值为True(1);如果变量没有值(即不包含数据),则返回布尔值False(0)。它使用两个参数执行测试,并将第二个参数的变量设置为等于被测试变量的值:

/// d ##class(PHA.TEST.ObjectScript).TestData()
ClassMethod TestData()
{
	IF $DATA(Var1,Var2) {
		WRITE "Var1 的值为",Var2,".",!  
	} ELSE {
		WRITE "Var1 未定义.",!
	}

	SET Var1 = 3
	set Var2 = 4
	IF $DATA(Var1,Var2) {
		WRITE "Var1 的值为 ",Var2,".",!  
	} ELSE {
		WRITE "Var1 未定义.",!
	}
}
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestData()
Var1 未定义.
Var1 的值为 3.

布尔值

在某些情况下,例如与逻辑命令或运算符一起使用时,值可能被解释为布尔值(TRUE或FALSE)。在这种情况下,如果表达式的计算结果为非零数值,则将其解释为1(TRUE),如果计算结果为零数值,则将表达式解释为0(FALSE)。数字字符串的计算结果为其数字值;非数字字符串的计算结果为0(False)。

例如,以下值被解释为TRUE:

/// d ##class(PHA.TEST.ObjectScript).TestTrue()
ClassMethod TestTrue()
{
	IF 1 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF 8.5 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF "1 banana" { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF 1+1 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF -7 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF +"007"=7 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
}
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestTrue()
evaluates as true
evaluates as true
evaluates as true
evaluates as true
evaluates as true
evaluates as true

以下值被解释为False:

/// d ##class(PHA.TEST.ObjectScript).TestFalse()
ClassMethod TestFalse()
{
	IF 0 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF 3-3 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF "one banana" { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF "" { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF -0 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
	IF "007"=7 { WRITE "evaluates as true",! }
	ELSE { WRITE "evaluates as false",! }
}
DHC-APP> d ##class(PHA.TEST.ObjectScript).TestFalse()
evaluates as false
evaluates as false
evaluates as false
evaluates as false
evaluates as false
evaluates as false

日期

Caché ObjectScript没有内置的Date类型;相反,它包括许多函数,用于操作和格式化表示为字符串的日期值。

这些包括:

格式 描述
$HOROLOG 这是$HOROLOG($H)特殊变量返回的格式。它是一个包含两个逗号分隔的整数的字符串:第一个是自1840年12月31日以来的天数;第二个是自当天午夜以来的秒数。$HOROLOG不支持小数秒。$NOW函数提供带有小数秒的$HOROLOG格式日期。Caché提供了许多函数,用于格式化和验证$HOROLOG格式的日期。
ODBC Date 这是ODBC和许多其他外部表示所使用的格式。它是一个格式为“YYYY-MM-DD hh:mm:ss”的字符串。ODBC日期值将进行排序;也就是说,如果按ODBC日期格式对数据进行排序,数据将自动按时间顺序排序。
ODBC Date 这是当前区域设置使用的格式。区域设置的日期格式不同,如下所示:“美国”日期的格式为mm/dd/yyyy(日期格式1)。“欧洲”日期的格式为dd/mm/yyyy(日期格式4)。除了csyw、deuw、engw、espw、eurw、fraw、itaw、mitw、ptbw、rusw、sky、svnw、turw、ukrw之外,所有区域设置都使用日期格式4。美国日期使用句点(.)。作为小数秒的小数分隔符。欧洲日期使用逗号(,)作为小数秒的分隔符,但以下日期除外-engw,eurw,sky-使用句点。所有区域设置都使用斜杠(/)作为dateseparator字符,以下区域设置除外,它们使用句点(.)。作为日期分隔字符-捷克语(Csyw)、俄语(Rusw)、斯洛伐克语(Sky W)、斯洛文尼亚语(Svnw)和乌克兰语(Ukrw)。
System Time 这是$ZHOROLOG($ZH)特殊变量返回的格式。它是一个浮点数,包含系统已经运行的秒数(及其部分)。停止并重新启动caché会重置此数字。通常,此格式用于计时和测试操作。

以下示例显示如何使用不同的日期格式:

/// d ##class(PHA.TEST.ObjectScript).TestDate()
ClassMethod TestDate()
{
 SET now = $HOROLOG
 WRITE "当前时间和日期($H): ",now,!

 SET odbc = $ZDATETIME(now,3)
 WRITE "当前时间和日期 (ODBC): ",odbc,!

 SET ldate = $ZDATETIME(now,-1)
 WRITE "当前区域设置格式的当前时间和日期: ",ldate,!

 SET time = $ZHOROLOG
 WRITE "当前系统时间 ($ZH): ",time,!
}
DHC-APP>d ##class(PHA.TEST.ObjectScript).TestDate()
当前时间和日期($H): 65454,61669
当前时间和日期 (ODBC): 2020-03-16 17:07:49
当前区域设置格式的当前时间和日期: 03/16/2020 17:07:49
当前系统时间 ($ZH): 159353.837575
原创文章 67 获赞 86 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/105964765