第八十三章 Caché 函數(shù)大全 $ZDATE 函數(shù)

第八十三章 Caché 函數(shù)大全 $ZDATE 函數(shù)

驗(yàn)證日期并將其從內(nèi)部格式轉(zhuǎn)換為指定的顯示格式籍救。

大綱

$ZDATE(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZD(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)

參數(shù)

  • hdate 一個(gè)整數(shù)羽嫡,指定內(nèi)部日期格式的值进鸠。該整數(shù)表示自1840年12月31日以來(lái)經(jīng)過(guò)的天數(shù)绽快。如果將$HOROLOG指定為hdate各拷,則僅使用$HOROLOG的日期部分茎刚。請(qǐng)參閱下面的hdate。
  • dformat 可選—一個(gè)整數(shù)代碼撤逢,指定返回日期的格式膛锭。請(qǐng)參閱下面的dformat粮坞。
  • monthlist 可選-字符串或變量名稱,用于指定一組月份名稱初狰。該字符串必須以分隔符開(kāi)頭莫杈,并且其12個(gè)條目必須由該分隔符分隔。請(qǐng)參閱下面的月列表奢入。
  • yearopt 可選—整數(shù)代碼筝闹,用于指定是將年表示為兩位數(shù)字還是四位數(shù)字的值。請(qǐng)參閱下面的yearopt腥光。
  • startwin 可選-滑動(dòng)窗口的開(kāi)始关顷,在此期間,日期必須用兩位數(shù)的年份表示武福。請(qǐng)參閱下面的startwin议双。
  • endwin 可選-滑動(dòng)窗口的末尾,其間用兩位數(shù)的年份表示日期捉片。請(qǐng)參閱下面的endwin皱坛。
  • mindate 可選-有效日期范圍的下限茄厘。指定為$HOROLOG整數(shù)日期計(jì)數(shù)团南,0表示1840年12月31日钳恕。可以指定為正整數(shù)或負(fù)整數(shù)莹规。請(qǐng)參閱下面的提示赔蒲。
  • maxdate 可選-有效日期范圍的上限。指定為$HOROLOG整數(shù)日期計(jì)數(shù)良漱。請(qǐng)參閱下面的maxdate嘹履。
  • erropt 可選-當(dāng)hdate無(wú)效時(shí)返回的表達(dá)式。為該參數(shù)指定值將抑制與無(wú)效或超出范圍的hdate值相關(guān)的錯(cuò)誤代碼债热。 $ZDATE而不是發(fā)出錯(cuò)誤消息,而是返回erropt幼苛。請(qǐng)參閱下面的錯(cuò)誤提示窒篱。
  • localeopt 可選-布爾值標(biāo)志,用于指定dformat舶沿,monthlist墙杯,yearopt,minate和maxdate默認(rèn)值以及其他日期特征(例如日期分隔符)使用的語(yǔ)言環(huán)境:localeopt = 0:當(dāng)前的語(yǔ)言環(huán)境屬性設(shè)置確定這些參數(shù)默認(rèn)值括荡。localeopt = 1:ODBC標(biāo)準(zhǔn)語(yǔ)言環(huán)境確定這些參數(shù)默認(rèn)值高镐。未指定localeopt:dformat值確定這些參數(shù)默認(rèn)值畸冲。如果dformat = 3嫉髓,則使用ODBC默認(rèn)值观腊。日文和回教日期dformatvalues使用其自己的默認(rèn)值。對(duì)于所有其他dformat值算行,當(dāng)前的語(yǔ)言環(huán)境屬性設(shè)置用作默認(rèn)值梧油。請(qǐng)參閱下面的localeopt。

指定參數(shù)值之間的省略參數(shù)由占位符逗號(hào)指示州邢。末尾的占位符逗號(hào)不是必需的儡陨,但允許使用。逗號(hào)之間允許有空格量淌,以指示省略的參數(shù)骗村。

描述

$ZDATE函數(shù)將內(nèi)部存儲(chǔ)格式($HOROLOG格式)的指定日期轉(zhuǎn)換為幾種備用日期顯示格式之一。 $ZDATE返回的值取決于使用的參數(shù)呀枢。

簡(jiǎn)單的$ZDATE格式

$ZDATE(hdate)是$ZDATE的最基本形式胚股,它以與指定hdate對(duì)應(yīng)的顯示格式返回日期。 hdate是自1840年12月31日起經(jīng)過(guò)的天數(shù)的整數(shù)硫狞。范圍從0到2980013(從12/31/1840到12/31/9999)信轿。

默認(rèn)情況下,$ZDATE(hdate)用兩位數(shù)字表示1900年到1999年之間的年份残吩。它用四位數(shù)字表示1900年之前或1999年之后的年份财忽。例如:

/// d ##class(PHA.TEST.Function).ZDATE()
ClassMethod ZDATE()
{
    WRITE $ZDATE(21400),!  ; returns 08/04/1899
    WRITE $ZDATE(50000),!  ; returns 11/23/77
    WRITE $ZDATE(60000),!  ; returns 04/10/2005
    WRITE $ZDATE(0),!      ; returns 12/31/1840
}
DHC-APP> d ##class(PHA.TEST.Function).ZDATE()
08/04/1899
11/23/77
04/10/2005
12/31/1840

當(dāng)提供$HOROLOG日期到$ZDATE時(shí),僅使用日期部分即彪。以$HOROLOG格式,日期和時(shí)間顯示為兩個(gè)整數(shù)深胳,中間用逗號(hào)分隔舞终。遇到逗號(hào)(非數(shù)字字符)時(shí),$ZDATE會(huì)忽略字符串的其余部分夸盟。在以下示例中桩砰,$ZDATE使用$HOROLOG格式值返回04/10/2005和當(dāng)前日期:

DHC-APP>WRITE !,$ZDATE("60000,12345")
 
04/10/2005
DHC-APP>WRITE !,$ZDATE($HOROLOG)
 
11/06/2020

可自定義日期默認(rèn)

在Caché啟動(dòng)時(shí),默認(rèn)日期格式被初始化為dformat = 1枢步,這是帶有斜杠日期分隔符(MM / DD / [YY] YY)的美國(guó)日期格式。要將此格式和其他默認(rèn)格式設(shè)置為當(dāng)前語(yǔ)言環(huán)境的值隘擎,請(qǐng)?jiān)O(shè)置以下全局變量:SET ^SYS("NLS","Config","LocaleFormat")=1劲够。這會(huì)將所有進(jìn)程的所有格式默認(rèn)值設(shè)置為當(dāng)前語(yǔ)言環(huán)境值蹲姐。這些默認(rèn)值將一直保留到更改此全局變量為止。

注意:本節(jié)介紹未定義localeopt或?qū)⑵湓O(shè)置為0時(shí)應(yīng)用的用戶語(yǔ)言環(huán)境定義江咳。當(dāng)localeopt = 1時(shí),$ZDATE使用預(yù)定義的ODBC語(yǔ)言環(huán)境。

可以使用NLS(國(guó)家語(yǔ)言支持)覆蓋當(dāng)前進(jìn)程的格式默認(rèn)值『巧冢可以將所有格式的默認(rèn)值更改為指定語(yǔ)言環(huán)境的值拒炎,也可以更改單個(gè)格式的值击你。

  • 要將所有格式默認(rèn)值(包括日期格式默認(rèn)值)設(shè)置為指定語(yǔ)言環(huán)境的屬性,請(qǐng)調(diào)用以下方法調(diào)用:SET fmt=##class(%SYS.NLS.Format).%New("lname") 鸿摇,其中l(wèi)name是所需語(yǔ)言環(huán)境的NLS名稱。 (例如筷黔,deuw =German,espw = Spanish,fraw = French损拢,ptbw = Brazilian Portuguese,rusw = Russian,jpnw = Japanese胆筒。在管理門戶中找到完整的語(yǔ)言環(huán)境列表:System,Configuration摧莽,NLS Settings,Locale Definitions )要將這些默認(rèn)設(shè)置設(shè)置為當(dāng)前語(yǔ)言環(huán)境的屬性,請(qǐng)指定lname為“ current”或空字符串(“”)受裹。
  • 要將默認(rèn)日期格式設(shè)置為指定的dformat格式镇匀,請(qǐng)調(diào)用SetFormatItem()方法:SET rtn=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",n)幸缕,其中n是希望將其設(shè)為默認(rèn)值的dformat值。

下面的示例演示如何將所有格式默認(rèn)設(shè)置為俄語(yǔ)語(yǔ)言環(huán)境栏尚,以默認(rèn)格式(俄語(yǔ))從$ZDATE返回日期官觅,然后將格式默認(rèn)值重置為當(dāng)前語(yǔ)言環(huán)境默認(rèn)值咱圆。請(qǐng)注意闷堡,俄語(yǔ)語(yǔ)言環(huán)境使用句點(diǎn)而不是斜杠作為日期部分分隔符:

/// d ##class(PHA.TEST.Function).ZDATE1()
ClassMethod ZDATE1()
{
    IF $SYSTEM.Version.IsUnicode() {
        WRITE !,$ZDATE($HOROLOG)
        SET fmt=##class(%SYS.NLS.Format).%New("rusw")
        WRITE !,$ZDATE($HOROLOG)
        SET fmt=##class(%SYS.NLS.Format).%New("current")
        WRITE !,$ZDATE($HOROLOG)
    } ELSE {
        WRITE "此示例需要Caché的Unicode安裝"
    }
}
DHC-APP>d ##class(PHA.TEST.Function).ZDATE1()
 
11/06/2020
06.11.2020
11/06/2020

下面的示例演示如何設(shè)置各個(gè)格式的默認(rèn)值。第一個(gè)$ZDATE以默認(rèn)格式返回日期疑故。第一個(gè)SetFormatItem()方法將默認(rèn)值更改為dformat = 4或歐洲日期格式(DD / MM / [YY] YY)杠览,如第二個(gè)$ZDATE所示。第二個(gè)SetFormatItem()方法更改日期分隔符的默認(rèn)值(這會(huì)影響dformat -1纵势、1踱阿、4和15)佛点。在此示例中颓帝,日期分隔符字符設(shè)置為點(diǎn)(“篷帅。”)鼻忠,如第三個(gè)$ZDATE所示。最后耳标,該程序?qū)⑦€原原始日期格式值:

/// d ##class(PHA.TEST.Function).ZDATE2()
ClassMethod ZDATE2()
{
InitialVals
    SET fmt=##class(%SYS.NLS.Format).GetFormatItem("DateFormat")
    SET sep=##class(%SYS.NLS.Format).GetFormatItem("DateSeparator")
    WRITE !,$ZDATE($HOROLOG)
ChangeVals
    SET x=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",3)
    WRITE !,$ZDATE($HOROLOG)
    SET y=##class(%SYS.NLS.Format).SetFormatItem("DateSeparator",".")
    WRITE !,$ZDATE($HOROLOG)
RestoreVals
    SET x=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",fmt)
    SET y=##class(%SYS.NLS.Format).SetFormatItem("DateSeparator",sep)
    WRITE !,$ZDATE($HOROLOG)
}
DHC-APP>d ##class(PHA.TEST.Function).ZDATE2()
 
11/06/2020
2020-11-06
2020-11-06
11/06/2020

參數(shù)

hdate

內(nèi)部日期格式值淫僻,表示自1840年12月31日以來(lái)經(jīng)過(guò)的天數(shù)针贬。默認(rèn)情況下,它必須是0到2980013之間的整數(shù)⊥馇可以將hdate指定為數(shù)字愉适,字符串文字或表達(dá)式也切。 Caché將hdate轉(zhuǎn)換為規(guī)范形式。它會(huì)在其第一個(gè)非數(shù)字字符處截?cái)鄶?shù)字字符串(例如$HOROLOG值)。它將非數(shù)字字符串評(píng)估為整數(shù)0耸别。不解析為整數(shù)的浮點(diǎn)數(shù)將生成<ILLEGAL VALUE>錯(cuò)誤。

默認(rèn)情況下速缨,最早的有效hdate為0(1840年12月31日)锌妻。默認(rèn)有效日期范圍是0到2980013(含),包括從12/31/1840到12/31/9999的日期旬牲。默認(rèn)情況下仿粹,日期限制為正整數(shù)搁吓,因?yàn)镈ateMinimum屬性默認(rèn)為0。如果當(dāng)前語(yǔ)言環(huán)境的DateMinimum屬性設(shè)置為更大或等于負(fù)整數(shù)吭历,則可以將較早的日期指定為負(fù)整數(shù)堕仔。有效的最低DateMinimum值的最低值是-672045,對(duì)應(yīng)于0001年1月1日晌区。Caché使用了多功的格里高利歷摩骨,將格里高利歷回溯到“ Year 1”,符合ISO 8601標(biāo)準(zhǔn)朗若。這在一定程度上是因?yàn)楣珰v是在不同國(guó)家的不同時(shí)間采用的恼五。例如,許多歐洲大陸在1582年采用了它哭懈;大不列顛及美國(guó)在1752年采用了它灾馒。因此,當(dāng)?shù)夭捎酶窭锔呃麣v之前的Caché日期可能與根據(jù)當(dāng)時(shí)有效的當(dāng)?shù)貧v法記錄的歷史日期不符银伟。有關(guān)1840年之前的日期的更多詳細(xì)信息,請(qǐng)參考mindate參數(shù)绘搞。

CachéSQL支持Caché配置設(shè)置ZDateNULL彤避。

  • 當(dāng)ZDateNULL = OFF(默認(rèn)值)時(shí),無(wú)效和超出范圍的hdate值的行為以及由此產(chǎn)生的錯(cuò)誤如erropt參數(shù)中所述夯辖。
  • 當(dāng)ZDateNULL = ON時(shí)琉预,無(wú)效和超出范圍的hdate值的行為以及由此產(chǎn)生的錯(cuò)誤如下:
    • 有效日期范圍是從1到94232(含),包括從01/01/1841到12/30/2098的日期蒿褂。該日期范圍是為具有三個(gè)或更少參數(shù)的任何$ZDATE函數(shù)調(diào)用設(shè)置的圆米。如果$ZDATE函數(shù)調(diào)用具有三個(gè)以上的參數(shù),則有效的日期范圍是從mindate和maxdate參數(shù)(如果指定)中獲取的啄栓,或者從為當(dāng)前語(yǔ)言環(huán)境建立的日期范圍中獲取娄帖。
    • 無(wú)效的日期值將返回空字符串(“”),而不是發(fā)出錯(cuò)誤昙楚。

dformat

返回日期的格式近速。有效值為:

含義
1 MM/DD/[YY]YY(07/01/97或03/27/2002)-美國(guó)數(shù)字格式。日期分隔符(/或.)堪旧。取自當(dāng)前區(qū)域設(shè)置削葱。
2 DD Mmm [ YY ]YY (01 Jul 97 or 27 Mar 2002)
3 YYYY-MM-DD (1997-07-01 or 2002-03-27) ODBC格式。默認(rèn)情況下淳梦,此格式與當(dāng)前的語(yǔ)言環(huán)境設(shè)置(localeopt = 1)無(wú)關(guān)析砸,從而以O(shè)DBC標(biāo)準(zhǔn)交換格式指定日期。要以這種格式使用當(dāng)前的日期語(yǔ)言環(huán)境設(shè)置爆袍,請(qǐng)?jiān)O(shè)置localeopt = 0首繁。
4 DD/MM/[YY]YY (01/07/97 or 27/03/2002) 歐洲數(shù)字格式。日期分隔符(/或所坯。)取自當(dāng)前的語(yǔ)言環(huán)境設(shè)置挂捅。
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) 數(shù)值格式
9 Mmmmm [D]D, YYYY (July 1, 1997 or March 27, 2002)
10 W(2)-一周中的天數(shù)芹助,從0(星期日)到6(星期六)編號(hào)状土。與$SYSTEM.SQL.DAYOFWEEK()方法進(jìn)行比較。
11 Www(Tue)-縮寫的日期名稱
12 Wwwwww (Tuesday))—全天名稱
13 [D]D/[M]M/YYYY (1/7/2549 or 27/11/2549) 泰文日期格式伺糠。除無(wú)前導(dǎo)零外,日和月與歐洲用法相同累驮。該年是佛教時(shí)代(BE)年谤专,通過(guò)在公歷年中增加543年而得出午绳。
14 nnn(354)-年的天數(shù)
15 DD/MM/[YY]YY (01/07/97 or 27/03/2002) 歐洲格式(與dformat = 4相同)拦焚。日期分隔符(/或赎败。)取自當(dāng)前的語(yǔ)言環(huán)境設(shè)置僵刮。
16 YYYYc[M]Mc[D]Dc —日文日期格式妓笙。年寞宫,月和日的編號(hào)與其他日期格式相同萧福;前導(dǎo)零被省略鲫忍。在年悟民,月和日編號(hào)之后插入“年”射亏,“月”和“日”的日語(yǔ)字符(在此處顯示為c)智润。這些字符是Year = $CHAR(24180)窟绷,Month = $CHAR(26376)和Day = $CHAR(26085)兼蜈。
17 YYYYc [M]Mc [D]Dc —日文日期格式为狸。與dformat 16相同钥平,除了在“ year”和“ month”日語(yǔ)字符之后插入空格涉瘾。
18 [D]D Mmmmm YYYY - 具有完整月份名稱的表格回歷(伊斯蘭)日期格式立叛。省略了日期前導(dǎo)零秘蛇。包括年份前導(dǎo)零赁还。教堂日期-445031(公元07/19/0622)= 1穆罕默德0001驹沿。
19 [D]D [M]M YYYY 帶月號(hào)的表格回歷(伊斯蘭)日期格式渊季。日和月的前導(dǎo)零被省略;包括年份前導(dǎo)零荷并。教堂日期-445031(西元07/19/0622)= 1 1 0001源织。
20 [D]D Mmmmm YYYY —觀察到的回歷(伊斯蘭)日期格式雀鹃,并帶有完整的月份名稱黎茎。默認(rèn)為表格回歷(dformat 18)傅瞻。要覆蓋表格計(jì)算嗅骄,請(qǐng)使用%Calendar.Hijri類添加對(duì)新月新月的觀測(cè)溺森。
21 [D]D [M]M YYYY —觀察到的回歷(伊斯蘭)日期格式和月數(shù)屏积。默認(rèn)為表格回歷(dformat 19)炊林。要覆蓋表格計(jì)算渣聚,請(qǐng)使用%Calendar.Hijri類添加對(duì)新月新月的觀測(cè)。
-1 從用戶的語(yǔ)言環(huán)境(如果localeopt = 0或未定義)或從ODBC語(yǔ)言環(huán)境(默認(rèn)為dformat = 3)獲取有效的dformat值隘道。如果dformat是從用戶的語(yǔ)言環(huán)境中獲取的薄声,則它是fmt.DateFormat的值默辨,其中fmt是與當(dāng)前進(jìn)程關(guān)聯(lián)的## class(%SYS.NLS.Format)的實(shí)例缩幸。如果不指定dformat表谊,則這是默認(rèn)行為爆办。

其中

語(yǔ)法 含義
YYYY YYYY是四位數(shù)的年份距辆。 [YY]如果hdate落在活動(dòng)窗口內(nèi)達(dá)兩位數(shù)年份爆土,則YY為兩位數(shù)年份步势;否則為四位數(shù)年份坏瘩。
MM 兩位數(shù)的月份:01到12桑腮。[M] M表示在月份1到9中省略了前導(dǎo)零。
DD 兩位數(shù)的日期:01到31奕纫。[D] D表示第1到9天省略了前導(dǎo)零。
Mmm 從當(dāng)前語(yǔ)言環(huán)境的MonthAbbr屬性中提取的月份縮寫升筏∧茫可以從指定為$ ZDATE的monthlist參數(shù)的可選列表中提取備用月份的縮寫(或任何長(zhǎng)度的名稱)灵汪。 MonthAbbr的默認(rèn)值是:“Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”
Mmmmm 由當(dāng)前語(yǔ)言環(huán)境的MonthName屬性指定的月份的全名享言。默認(rèn)值為:“January February March ... November December”
W 數(shù)字0-6表示星期幾:Sunday=0, Monday=1, Tuesday=2, etc.
Www 工作日名稱縮寫荧琼,由當(dāng)前語(yǔ)言環(huán)境的WeekdayAbbr屬性指定铭腕。默認(rèn)值為:“Sun Mon Tue Wed Thu Fri Sat”
Wwwwww 由當(dāng)前語(yǔ)言環(huán)境的WeekdayName屬性指定的工作日全名累舷。默認(rèn)值為:“Sunday Monday Tuesday ... Friday Saturday”
nnn 指定年份的天數(shù)被盈,始終為三位數(shù)只怎,如有必要,前導(dǎo)零贴谎。值是001到365(leap年時(shí)是366)擅这。

dformat Default

如果省略dformat或?qū)⑵湓O(shè)置為-1仲翎,則dformat的默認(rèn)值取決于localeopt參數(shù)和NLS DateFormat屬性:

  • 如果localeopt = 1鲫构,則dformat的默認(rèn)值為ODBC格式芬迄。 monthlist禀梳,yearopt算途,mindate和maxdate參數(shù)的默認(rèn)值也設(shè)置為ODBC格式。這與設(shè)置dformat = 3相同廓脆。
  • 如果localeopt = 0或未指定停忿,則dformat默認(rèn)值來(lái)自NLS DateFormat屬性席赂。如果DateFormat = 3,則dformat的默認(rèn)值為ODBC格式癞揉。但是喊熟,DateFormat = 3不會(huì)影響在當(dāng)前NLS語(yǔ)言環(huán)境定義中指定的monthlist预吆,yearopt,mindate和maxdate參數(shù)默認(rèn)值扇商。

若要確定語(yǔ)言環(huán)境的默認(rèn)日期格式案铺,請(qǐng)調(diào)用GetFormatItem()NLS類方法:

WRITE ##class(%SYS.NLS.Format).GetFormatItem("DateFormat")

歐洲日期格式(dformat = 4,DD / MM / YYYY順序)是許多(但不是全部)歐洲語(yǔ)言的默認(rèn)格式姑子,包括英式英語(yǔ)街佑,法語(yǔ),德語(yǔ)磁携,意大利語(yǔ)颜武,西班牙語(yǔ)和葡萄牙語(yǔ)(使用“ /”日期分隔符)字符),以及捷克語(yǔ)(csyw)篙议,俄語(yǔ)(rusw)鬼贱,斯洛伐克語(yǔ)(skyw),斯洛文尼亞語(yǔ)(svnw)和烏克蘭語(yǔ)(ukrw)(使用“姻乓√Q遥” DateSeparator字符)剪个。

dformat Settings

如果dformat為3(ODBC日期格式)乎折,則ODBC格式默認(rèn)值也用于monthlist笆檀,yearopt,minate和maxdate參數(shù)默認(rèn)值樱衷。當(dāng)前的語(yǔ)言環(huán)境默認(rèn)值將被忽略矩桂。

如果dformat為-1、1癞蚕、4、13或15(數(shù)字日期格式)恒水,則$ZDATE使用當(dāng)前語(yǔ)言環(huán)境的DateSeparator屬性的值作為月钉凌,日和年之間的分隔符矢沿。當(dāng)dformat為3時(shí)咨察,使用ODBC日期分隔符(“-”)脓诡。對(duì)于所有其他dformat值祝谚,空格用作日期分隔符次泽。 DateSeparator的英語(yǔ)默認(rèn)值為“ /”,并且所有文檔都使用此分隔符玖像。

如果dformat是11或12(日期名稱)且localeopt = 0或未指定捐寥,則日期名稱值來(lái)自當(dāng)前的語(yǔ)言環(huán)境屬性。如果localeopt = 1睡互,則日期名稱來(lái)自O(shè)DBC語(yǔ)言環(huán)境。若要確定語(yǔ)言環(huán)境的默認(rèn)工作日名稱和工作日縮寫妻怎,請(qǐng)調(diào)用以下NLS類方法:

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayName"),!
  WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayAbbr"),!

如果dformat為16或17(日語(yǔ)日期格式)匿辩,則返回的日期格式與語(yǔ)言環(huán)境設(shè)置無(wú)關(guān)〖诓。可以從任何UnicodeCaché實(shí)例返回日語(yǔ)格式的日期。在8位Caché實(shí)例上芍瑞,將dformat指定為16或17會(huì)導(dǎo)致錯(cuò)誤。

如果dformat為18妥凳、19竟贯、20或21(伊斯蘭日期格式)且未指定localeopt,則參數(shù)默認(rèn)為伊斯蘭默認(rèn)值猾封,而不是當(dāng)前的語(yǔ)言環(huán)境默認(rèn)值澄耍。 monthlist參數(shù)默認(rèn)為阿拉伯語(yǔ)月份名稱,并用拉丁字符音譯晌缘。 tformat,yearopt磷箕,mindate和maxdate參數(shù)默認(rèn)為ODBC默認(rèn)值选酗。日期分隔符默認(rèn)為回教默認(rèn)值(一個(gè)空格),而不是ODBC默認(rèn)值或當(dāng)前區(qū)域設(shè)置的DateSeparator屬性值岳枷。如果localeopt = 0芒填,則將當(dāng)前語(yǔ)言環(huán)境屬性默認(rèn)值用于這些參數(shù)。如果localeopt = 1空繁,則將ODBC默認(rèn)值用于這些參數(shù)殿衰。

monthlist

該表達(dá)式可解析為月份名稱或月份名稱縮寫的字符串,以分隔符分隔盛泡。 monthlist中的名稱替換了來(lái)自當(dāng)前語(yǔ)言環(huán)境的MonthAbbr屬性的默認(rèn)月份縮寫值或來(lái)自MonthName屬性的月份名稱值闷祥。

僅當(dāng)dformat為2、5傲诵、6凯砍、7箱硕、9、18或20時(shí)悟衩,monthlist才有效剧罩。如果dformat為任何其他值,$ZDATE將忽略monthlist座泳。

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

  • 字符串的第一個(gè)字符是定界符(通常為空格)惠昔。同一分隔符必須出現(xiàn)在月份列表的第一個(gè)月份名稱之前和每個(gè)月份名稱之間∏ィ可以指定任何單字符定界符舰罚;該分隔符出現(xiàn)在返回日期值的月纽门,日和年部分之間薛耻,這就是為什么通常使用空格作為首選字符的原因。

  • 月份名稱字符串應(yīng)包含十二個(gè)分隔值赏陵,分別對(duì)應(yīng)于一月到十二月饼齿。可以指定多于或少于十二個(gè)月的名稱蝙搔,但是如果沒(méi)有對(duì)應(yīng)于hdate中月份的月份名稱缕溉,則會(huì)生成<ILLEGAL VALUE>錯(cuò)誤。

如果省略monthlist或?qū)onthlist值指定為-1吃型,則$ZDATE使用在當(dāng)前語(yǔ)言環(huán)境的MonthAbbr或MonthName屬性中定義的月份名稱列表证鸥,除非滿足以下條件之一:如果localeopt = 1,則月份列表默認(rèn)值為ODBC月列表(英文)勤晚。如果未指定localeopt且dformat為18或20(伊斯蘭日期格式)枉层,則月列表默認(rèn)值為伊斯蘭月份列表(使用拉丁字母表示的阿拉伯名稱),忽略MonthAbbrMonthName屬性值赐写。

若要確定語(yǔ)言環(huán)境的默認(rèn)月份名稱和月份縮寫鸟蜡,請(qǐng)調(diào)用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

以下示例列出了月份名稱的默認(rèn)語(yǔ)言環(huán)境,將此過(guò)程的語(yǔ)言環(huán)境更改為俄語(yǔ)語(yǔ)言環(huán)境挺邀,然后列出了俄語(yǔ)月份名稱并顯示了帶有俄語(yǔ)月份名稱的當(dāng)前日期揉忘。然后,它將語(yǔ)言環(huán)境默認(rèn)值恢復(fù)為當(dāng)前語(yǔ)言環(huán)境端铛,并再次顯示當(dāng)前日期泣矛,這次是默認(rèn)的月份名稱。

/// d ##class(PHA.TEST.Function).ZDATE4()
ClassMethod ZDATE4()
{

    WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthName"),!
    SET fmt=##class(%SYS.NLS.Format).%New("rusw")
    WRITE fmt.MonthName,!
    WRITE $ZDATE($HOROLOG,9),!
    SET fmt=##class(%SYS.NLS.Format).%New()
    WRITE $ZDATE($HOROLOG,9)
}

yearopt

使用dformat值1禾蚕、2您朽、4、7或15夕膀,這是一個(gè)整數(shù)代碼虚倒,用于指定將年顯示為兩位數(shù)值的時(shí)間窗口美侦。對(duì)于所有其他dformat值,將忽略yearopt魂奥。有效的yearopt值為:

描述
-1 從當(dāng)前語(yǔ)言環(huán)境的YearOption屬性獲取有效的yearopt值菠剩,該值默認(rèn)為0。如果未指定yearopt耻煤,則這是默認(rèn)行為具壮。
0 除非有效的過(guò)程特定的滑動(dòng)窗口(通過(guò)%DATE實(shí)用程序建立),否則用兩位數(shù)的年份表示20世紀(jì)日期(1900年至1999年)哈蝇,而所有其他日期則用4位年份表示棺妓。如果這樣的窗口有效,則僅將落在滑動(dòng)窗口中的那些日期表示為兩位數(shù)年份炮赦,而將所有其他日期表示為四位數(shù)年份怜跑。
1 代表20世紀(jì)的日期用兩位數(shù)的年份表示,其他所有日期用4位數(shù)的年份表示吠勘。
2 用兩位年份表示所有日期性芬。
3 這些日期用兩位數(shù)的年份表示由startwin和(可選)endwin定義的滑動(dòng)時(shí)間范圍內(nèi)的日期。用四位數(shù)字的年份表示所有其他日期剧防。當(dāng)yearopt = 3時(shí)植锉,startwin和endwin是$HOROLOG格式的絕對(duì)日期。
4 用四位數(shù)年份表示所有日期峭拘。 ODBC年選項(xiàng)俊庇。
5 用兩位數(shù)年份表示所有日期,它們都落在startwin和(可選)endwin定義的滑動(dòng)時(shí)間窗口內(nèi)鸡挠。用四位數(shù)字的年份表示所有其他日期辉饱。當(dāng)yearopt = 5時(shí),startwin和endwin是相對(duì)年份宵凌。
6 用兩位數(shù)字年份代表當(dāng)前世紀(jì)的所有日期鞋囊,而用四位數(shù)年份代表所有其他日期。

若要確定語(yǔ)言環(huán)境的默認(rèn)年份選項(xiàng)瞎惫,請(qǐng)調(diào)用GetFormatItem()NLS類方法:

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

如果省略yearopt或?qū)earopt值指定為-1溜腐,則$ZDATE使用當(dāng)前語(yǔ)言環(huán)境的YearOption屬性,除非滿足以下條件之一:如果localeopt = 1瓜喇,則yearopt默認(rèn)為ODBC year選項(xiàng)挺益。如果localeopt = 0或未指定,并且dformat是18乘寒、19望众、20或21(伊斯蘭日期格式),則yearopt的默認(rèn)值為ODBC year選項(xiàng)(4位數(shù)字的年份);否則烂翰,默認(rèn)值為ODBC年夯缺。回教日期將忽略YearOption屬性值甘耿。

解決2000年以前的年份是2位數(shù)

DHC-APP>w $Zd($h-2000)
05/22/2015
DHC-APP>w $Zd($h-20000)
02/08/66
DHC-APP>w $Zd($h-20000,,,4)
02/08/1966

startwin

一個(gè)數(shù)字值踊兜,指定滑動(dòng)窗口的開(kāi)始,在此期間佳恬,日期必須用兩位數(shù)的年份表示捏境。請(qǐng)參閱參數(shù)部分。當(dāng)yearopt為3或5時(shí)毁葱,必須提供startwin垫言。startwin不適用于任何其他yearopt值。

當(dāng)yearopt = 3時(shí)倾剿,startwin是$HOROLOG日期格式的絕對(duì)日期筷频,指示滑動(dòng)窗口的開(kāi)始日期。

當(dāng)yearopt = 5時(shí)柱告,startwin是一個(gè)數(shù)字值截驮,表示滑動(dòng)窗口的開(kāi)始年份笑陈,表示為當(dāng)前年份之前的年數(shù)际度。滑動(dòng)窗口始終從startwin中指定的一年的1月1日開(kāi)始涵妥。

endwin

一個(gè)數(shù)字值乖菱,指定滑動(dòng)窗口的結(jié)束,在此期間內(nèi)蓬网,日期用兩位數(shù)的年份表示窒所。當(dāng)yearopt為3或5時(shí),您可以選擇提供endwin帆锋。endwin不適用于任何其他yearopt值吵取。

當(dāng)yearopt = 3時(shí),endwin是$HOROLOG日期格式的絕對(duì)日期锯厢,指示滑動(dòng)窗口的結(jié)束日期皮官。

當(dāng)yearopt = 5時(shí),endwin是一個(gè)數(shù)字值实辑,它表示滑動(dòng)窗口的結(jié)束年份捺氢,表示為當(dāng)前年份之后的年數(shù)〖羟耍滑動(dòng)窗口始終在endwin中指定的當(dāng)年12月31日結(jié)束摄乒。如果未指定endwin,則默認(rèn)為startwin后100年的12月31日。

如果省略endwin(或指定為-1)馍佑,則有效滑動(dòng)窗口將為100年斋否。 endwin值為-1是一種特殊情況,即使較高和較低endwin值返回錯(cuò)誤拭荤,也總是返回日期值如叼。因此,最好在指定100年窗口時(shí)省略endwin穷劈,并避免使用負(fù)endwin值笼恰。

如果同時(shí)提供startwin和endwin,則它們指定的滑動(dòng)窗口的持續(xù)時(shí)間不得超過(guò)100年歇终。

mindate

該表達(dá)式指定有效日期范圍的下限(含)社证。可以指定為$HOROLOG整數(shù)日期計(jì)數(shù)(例如评凝,2013年1月1日表示為62823)或$HOROLOG字符串值追葡。可以包括或忽略$HOROLOG日期字符串的時(shí)間部分(例如“62823,43200”)奕短,但僅解析mindate的日期部分宜肉。早于mindate指定hdate值會(huì)生成錯(cuò)誤。

以下是受支持的提示值:

  • 正整數(shù):最常見(jiàn)的正念指定為正整數(shù)翎碑,以建立最早的允許日期為1840年12月31日之后的某個(gè)日期谬返。例如,正念21550會(huì)將最早的允許日期建立為1900年1月1日日杈。最高有效值是2980013(9999年12月31日)遣铝。
  • 0:指定最小日期為1840年12月31日。這是DateMinimum屬性的默認(rèn)值莉擒。
  • 負(fù)整數(shù)-2或更大:指定從1840年12月31日開(kāi)始倒數(shù)的最小日期酿炸。例如,記號(hào)-14974將建立最早的允許日期為1800年1月1日涨冀。負(fù)記號(hào)值僅在DateMinimum屬性為時(shí)才有意義填硕。當(dāng)前語(yǔ)言環(huán)境已設(shè)置為等于或大于負(fù)數(shù)。最低有效值為-672045鹿鳖。
  • 如果省略(或指定為-1)扁眯,則mindate默認(rèn)為當(dāng)前語(yǔ)言環(huán)境的DateMinimum屬性值,除非以下條件之一為真:如果localeopt = 1栓辜,則minindate默認(rèn)值為0恋拍。如果localeopt未指定且dformat = 3,預(yù)設(shè)值是0藕甩。如果未指定localeopt并且dformat是18施敢、19周荐、20或21(伊斯蘭日期格式),則預(yù)設(shè)值是0僵娃。

可以獲取并設(shè)置DateMinimum屬性概作,如下所示:

/// d ##class(PHA.TEST.Function).ZDATE5()
ClassMethod ZDATE5()
{
 SET min=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
  WRITE "初始DateMinimum值為 ",min,!
Permit18thCenturyDates
  SET x=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-51498)
  SET newmin=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
  WRITE "設(shè)置DateMinimum值為 ",newmin,!!
RestrictTo19thCenturyDates
  WRITE $ZDATE(-13000,1,,,,,-14974),!!
ResetDateMinimumToDefault
  SET oldmin=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",min)
  WRITE "從重置DateMinimum值",oldmin," to ",min
}
DHC-APP>d ##class(PHA.TEST.Function).ZDATE5()
初始DateMinimum值為 0
設(shè)置DateMinimum值為 -51498
 
05/29/1805
 
從重置DateMinimum值-51498 to 0

可以指定有或沒(méi)有maxdate的提示。指定大于maxdate的提示時(shí)默怨,會(huì)產(chǎn)生<ILLEGAL VALUE>錯(cuò)誤讯榕。

ODBC Date Format (dformat 3)

DateMinimum屬性的應(yīng)用由localeopt設(shè)置控制。當(dāng)localeopt = 1dformat = 3的默認(rèn)值)時(shí)匙睹,無(wú)論當(dāng)前的區(qū)域設(shè)置如何愚屁,最小日期均為0。因此,采用ODBC格式(dformat = 3),可以使用以下命令指定1840年12月31日之前的日期:

  • 指定早于指定日期的提示:
DHC-APP> WRITE $ZDATE(-30,3,,,,,-365)
1840-12-01
  • 指定早于指定日期的DateMinimum屬性值呛牲,并設(shè)置localeopt = 0
DHC-APP> DO ##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-365)
 
DHC-APP>WRITE $ZDATE(-30,3,,,,,,,,0)
1840-12-01

maxdate

該表達(dá)式指定有效日期范圍的上限(含)滴肿≌裕可以指定為$HOROLOG整數(shù)日期計(jì)數(shù)(例如1/1/2100表示為94599)或$HOROLOG字符串值。可以包括或省略$HOROLOG日期的時(shí)間部分(例如“94599,43200”),但僅會(huì)解析maxdate的日期部分闭树。

如果省略了maxdate或?qū)⑵渲付?1,則最大日期限制是從當(dāng)前語(yǔ)言環(huán)境的DateMaximum屬性獲取的荒澡,該屬性默認(rèn)為$HOROLOG日期部分的最大允許值:2980013(對(duì)應(yīng)于9999年12月31日) )报辱。但是,DateMaximum屬性的應(yīng)用由localeopt設(shè)置控制仰猖。當(dāng)localeopt = 1dformat = 3的默認(rèn)值)時(shí)捏肢,最大的默認(rèn)日期是ODBC值(2980013),與當(dāng)前的語(yǔ)言環(huán)境設(shè)置無(wú)關(guān)饥侵。回教日期格式也采用ODBC默認(rèn)值衣屏。泰文日期格式(dformat = 13)的最大日期是$HOROLOG 2781687躏升,對(duì)應(yīng)于BE 31/12/9999。

指定大于maxdate的hdate會(huì)產(chǎn)生<VALUE OUT OF RANGE>錯(cuò)誤狼忱。

如果指定的最大日期大于2980013膨疏,則會(huì)產(chǎn)生<ILLEGAL VALUE>錯(cuò)誤。

可以指定maxdate或不指定钻弄。指定的maxdate小于mindate會(huì)生成<ILLEGAL VALUE>錯(cuò)誤佃却。

erropt

為該參數(shù)指定值將抑制與無(wú)效或超出范圍的hdate值相關(guān)的<ILLEGAL VALUE> <VALUE OUT OF RANGE>錯(cuò)誤。 $ZDATE函數(shù)返回錯(cuò)誤值窘俺,而不是生成或錯(cuò)誤饲帅。

  • 驗(yàn)證:Caché對(duì)hdate執(zhí)行規(guī)范的數(shù)字轉(zhuǎn)換。 hdate字符串的解析在第一個(gè)非數(shù)字字符處停止。因此灶泵,hdate字符串(例如64687AD)與64687相同育八。非數(shù)字日期(包括空字符串)的計(jì)算結(jié)果為0。因此赦邻,空字符串hdate返回$HOROLOG初始日期:1840年12月31日髓棋。但是,如果hdate不會(huì)計(jì)算為整數(shù)(包含非零小數(shù))惶洲,它會(huì)生成<ILLEGAL VALUE>錯(cuò)誤按声。
  • 范圍:hdate必須計(jì)算為mindate / maxdate范圍內(nèi)的整數(shù)。默認(rèn)情況下恬吕,大于2980013或小于0的日期值會(huì)生成錯(cuò)誤儒喊。通過(guò)將mindate設(shè)置為負(fù)數(shù),可以擴(kuò)展1840年12月31日之前的有效日期范圍币呵。但是怀愧,對(duì)于dformat 18、19余赢、20或21(回教伊斯蘭歷)日期芯义,-445031之前的任何日期都會(huì)生成即使將mindate設(shè)置為較早的日期,也會(huì)出現(xiàn)<ILLEGAL VALUE>錯(cuò)誤妻柒。

erropt參數(shù)僅抑制由于hdate的無(wú)效值或超出范圍的值而生成的錯(cuò)誤扛拨。無(wú)論是否提供錯(cuò)誤提示,由于其他參數(shù)無(wú)效或超出范圍而產(chǎn)生的錯(cuò)誤將始終產(chǎn)生錯(cuò)誤举塔。

例如绑警,當(dāng)$ZDATE指定一個(gè)滑動(dòng)窗口,其中endwin早于startwin時(shí)央渣,總是生成<ILLEGAL VALUE>錯(cuò)誤计盒。同樣,當(dāng)maxdate小于mindate時(shí)芽丹,會(huì)生成<ILLEGAL VALUE>錯(cuò)誤北启。

ZDateNull的無(wú)效日期處理

可以使用ZDateNull設(shè)置$ZDATE的行為,為hdate賦予無(wú)效值時(shí)拔第。若要為當(dāng)前進(jìn)程設(shè)置此行為咕村,請(qǐng)使用%SYSTEM.Process類的ZDateNull()方法∥冒常可以通過(guò)設(shè)置Config.Miscellaneous類的ZDateNull屬性來(lái)建立系統(tǒng)范圍的默認(rèn)行為懈涛。 $ZDATE可以發(fā)出錯(cuò)誤,也可以返回空值泳猬。

系統(tǒng)范圍的默認(rèn)行為是可配置的批钠。轉(zhuǎn)到管理門戶宇植,選擇“系統(tǒng)”,“配置”价匠,“兼容性設(shè)置”当纱。查看和編輯ZDateNull的當(dāng)前設(shè)置。默認(rèn)值為“false”踩窖,表示$ZDATE返回錯(cuò)誤坡氯。

localeopt

此布爾值參數(shù)將用戶的當(dāng)前語(yǔ)言環(huán)境定義或ODBC語(yǔ)言環(huán)境定義指定為語(yǔ)言環(huán)境指定的參數(shù)dformat,monthlist洋腮,yearopt箫柳,minate和maxdate的默認(rèn)值的來(lái)源:

  • 如果localeopt = 0,則所有這些參數(shù)均采用當(dāng)前的語(yǔ)言環(huán)境定義默認(rèn)值啥供。
  • 如果localeopt = 1悯恍,則所有這些參數(shù)均采用ODBC默認(rèn)值。
  • 如果未指定localeopt伙狐,則dformat參數(shù)確定這些參數(shù)的默認(rèn)值涮毫。如果dformat = 3,則使用ODBC默認(rèn)值贷屎。如果dformat為18罢防、19、20或21唉侄,則無(wú)論當(dāng)前語(yǔ)言環(huán)境定義如何咒吐,都使用回教日期格式默認(rèn)值。對(duì)于所有其他dformat值属划,使用當(dāng)前的語(yǔ)言環(huán)境定義默認(rèn)值恬叹。

不能更改ODBC語(yǔ)言環(huán)境。它用于格式化日期字符串同眯,這些日期字符串在選擇了不同的國(guó)家語(yǔ)言支持(NLS)的Caché流程之間可移植绽昼。如果localeopt = 1,則ODBC區(qū)域設(shè)置日期定義如下:

  • 日期格式默認(rèn)為3嗽测。因此绪励,如果dformat未定義或?yàn)?1,則使用日期格式3唠粥。
  • 日期分隔符默認(rèn)為“/”。但是停做,日期格式默認(rèn)為3晤愧,該格式始終使用“-”作為日期分隔符。
  • Year選項(xiàng)默認(rèn)為4位數(shù)字蛉腌。
  • 最小和最大日期:0和2980013($HOROLOG日期計(jì)數(shù))官份。
  • 使用英語(yǔ)月份名稱只厘,月份縮寫,工作日名稱和工作日縮寫舅巷。

示例

日期格式示例

下面的示例說(shuō)明$ZDATE如何返回當(dāng)前日期的各種dformat格式羔味。 yearopt采用默認(rèn)值。當(dāng)然钠右,日期分隔符以及月份和星期幾的名稱和縮寫取決于語(yǔ)言環(huán)境赋元。本示例使用當(dāng)前的用戶區(qū)域設(shè)置定義:

/// d ##class(PHA.TEST.Function).ZDATE6()
ClassMethod ZDATE6()
{
    WRITE $ZDATE($HOROLOG),  "   default date format",!
    WRITE $ZDATE($HOROLOG,1),"   1=American numeric format",!
    WRITE $ZDATE($HOROLOG,2),"   2=Month abbreviation format",!
    WRITE $ZDATE($HOROLOG,3),"   3=ODBC numeric format",!
    WRITE $ZDATE($HOROLOG,4),"   4=European numeric format",!
    WRITE $ZDATE($HOROLOG,5),"   5=Month abbreviation format",!
    WRITE $ZDATE($HOROLOG,6),"   6=Month abbreviation format",!
    WRITE $ZDATE($HOROLOG,7),"   7=Month abbreviation format",!
    WRITE $ZDATE($HOROLOG,8),"   8=Numeric format no spaces",!
    WRITE $ZDATE($HOROLOG,9),"   9=Month name format",!
    WRITE $ZDATE($HOROLOG,10),"  10=Day-of-week format",!
    WRITE $ZDATE($HOROLOG,11),"  11=Day abbreviation format",!
    WRITE $ZDATE($HOROLOG,12),"  12=Day name format",!
    WRITE $ZDATE($HOROLOG,13),"  13=Thai numeric format",!
    WRITE $ZDATE($HOROLOG,14),"  14=Day-of-year format",!
    WRITE $ZDATE($HOROLOG,15),"  15=European numeric format",!
    WRITE $ZDATE($HOROLOG,16),"  16=Japanese date format",!
    WRITE $ZDATE($HOROLOG,17),"  17=Japanese date format with spaces"
}
DHC-APP>d ##class(PHA.TEST.Function).ZDATE6()
11/11/2020   default date format
11/11/2020   1=American numeric format
11 Nov 2020   2=Month abbreviation format
2020-11-11   3=ODBC numeric format
11/11/2020   4=European numeric format
Nov 11, 2020   5=Month abbreviation format
Nov 11 2020   6=Month abbreviation format
Nov 11 2020   7=Month abbreviation format
20201111   8=Numeric format no spaces
November 11, 2020   9=Month name format
3  10=Day-of-week format
Wed  11=Day abbreviation format
Wednesday  12=Day name format
11/11/2563  13=Thai numeric format
316  14=Day-of-year format
11/11/2020  15=European numeric format
2020年11月11日  16=Japanese date format
2020年 11月 11日  17=Japanese date format with spaces

下面的示例將日期與區(qū)域設(shè)置進(jìn)行比較,該區(qū)域設(shè)置默認(rèn)為當(dāng)前用戶區(qū)域設(shè)置與日期(當(dāng)localeopt = 1激活ODBC區(qū)域設(shè)置定義時(shí))飒房。為了使該示例更有趣搁凸,將當(dāng)前用戶區(qū)域設(shè)置設(shè)置為法語(yǔ):

/// d ##class(PHA.TEST.Function).ZDATE7()
ClassMethod ZDATE7()
{
    SET fmt=##class(%SYS.NLS.Format).%New("fraw")
    WRITE "default: local=",$ZDATE($HOROLOG),"   ODBC=",$ZDATE($HOROLOG,,,,,,,,,1),!
    WRITE "-1:      local=",$ZDATE($HOROLOG,-1),"   ODBC=",$ZDATE($HOROLOG,-1,,,,,,,,1),!!
    FOR x=1:1:17 {
        WRITE x,": local=",$ZDATE($HOROLOG,x),"   ODBC=",$ZDATE($HOROLOG,x,,,,,,,,1),! 
    }
}

DHC-APP>d ##class(PHA.TEST.Function).ZDATE7()
default: local=11/11/2020   ODBC=2020-11-11
-1:      local=11/11/2020   ODBC=2020-11-11
 
1: local=11/11/2020   ODBC=11/11/2020
2: local=11 Nov 2020   ODBC=11 Nov 2020
3: local=2020-11-11   ODBC=2020-11-11
4: local=11/11/2020   ODBC=11/11/2020
5: local=Nov 11, 2020   ODBC=Nov 11, 2020
6: local=Nov 11 2020   ODBC=Nov 11 2020
7: local=Nov 11 2020   ODBC=Nov 11 2020
8: local=20201111   ODBC=20201111
9: local=Novembre 11, 2020   ODBC=November 11, 2020
10: local=3   ODBC=3
11: local=Mer   ODBC=Wed
12: local=Mercredi   ODBC=Wednesday
13: local=11/11/2563   ODBC=11/11/2563
14: local=316   ODBC=316
15: local=11/11/2020   ODBC=11/11/2020
16: local=2020年11月11日   ODBC=2020年11月11日
17: local=2020年 11月 11日   ODBC=2020年 11月 11日

兩位數(shù)的年份滑動(dòng)窗口示例

為了說(shuō)明如何使用顯式滑動(dòng)窗口,假設(shè)在1997年輸入以下函數(shù)調(diào)用狠毯。59461的日期表示2003年10月19日护糖; hd的日期為2003年10月19日。 dformat 1允許它返回兩位數(shù)或四位數(shù)的年份嚼松,yearopt 5可以指定四位數(shù)年份的滑動(dòng)窗口嫡良。由于使用了yearopt設(shè)置,因此通過(guò)加法和減法來(lái)計(jì)算相對(duì)于當(dāng)年(在本例中為1997)的startwin和endwin献酗。

DHC-APP>WRITE $ZDATE(59461,1,,5,90,10)
10/19/03

用于將年份顯示為兩位數(shù)的滑動(dòng)窗口從1/1/1907擴(kuò)展到12/31/2006寝受。因此,Caché將日期顯示為10/19/03凌摄。

日期范圍示例

下面的示例使用mindate和maxdate測(cè)試可能的出生日期羡蛾。 maxdate假定出生日期不能在將來(lái)。這位思想家假設(shè)列出的任何人都不會(huì)超過(guò)124歲锨亏。日期以$HOROLOG格式指定:

/// d ##class(PHA.TEST.Function).ZDATE8()
ClassMethod ZDATE8()
{
    SET bdateh(1)=62142
    SET bdateh(2)=16800
    SET bdateh(3)=70000
    DO $SYSTEM.Process.ZDateNull(1)
    SET maxdate=$PIECE($HOROLOG,",",1)+1
    SET mindate=maxdate-(365.25*124)
    FOR x=1:1:3 {
        SET bdate=$ZDATE(bdateh(x),,,,,,mindate,maxdate)
        IF bdate="" {WRITE "Birth date ",bdateh(x)," is out of range",!}
        ELSE {WRITE "Birth date ",bdateh(x)," is ",bdate,!}
    }
}
DHC-APP>d ##class(PHA.TEST.Function).ZDATE8()
Birth date 62142 is 20/02/2011
Birth date 16800 is out of range
Birth date 70000 is out of range

上面的$ZDATE輸入值中有兩個(gè)不在出生日期測(cè)試的日期范圍之內(nèi):16800(12/30/1886)在124年前痴怨,而70000(08/26/2032)在將來(lái)。默認(rèn)情況下器予,這些$ZDATE調(diào)用將生成錯(cuò)誤浪藻,但是由于設(shè)置了ZDateNull(1),它們將返回空字符串(“”)乾翔。

注意

$ZDATE的值無(wú)效

在以下情況下爱葵,收到<FUNCTION> 錯(cuò)誤:

  • 如果指定了無(wú)效的dformat代碼(小于-1或大于17的整數(shù)值,或者非整數(shù)值)反浓。
  • 如果在yearopt為3或5時(shí)未指定startwin值萌丈。

在以下情況下,會(huì)收到<ILLEGAL VALUE>錯(cuò)誤:

  • 如果為hdate指定了無(wú)效值雷则,并且不提供錯(cuò)誤值或設(shè)置ZDateNull(如下所述)辆雾。
  • 如果給定的月份數(shù)大于monthlist中的月份數(shù)。
  • 如果maxdate小于主意月劈。
  • 如果endwin小于startwin度迂。
  • 如果startwin和endwin指定滑動(dòng)時(shí)間窗口藤乙,其持續(xù)時(shí)間大于100年。

在以下情況下惭墓,收到<VALUE OUT OF RANGE>錯(cuò)誤:

  • 如果指定的hdate值超出有效日期范圍坛梁。對(duì)于標(biāo)準(zhǔn)Caché,它是0到298013腊凶。對(duì)于ISM兼容的Caché划咐,它是1到94232】越疲可以使用%SYSTEM.Process類的ZDateNull()方法來(lái)設(shè)置日期范圍和當(dāng)前進(jìn)程的無(wú)效日期行為尖殃。
  • 如果指定的其他有效日期超出了為maxdate和mindate假定的值所定義的范圍,并且不提供錯(cuò)誤的值划煮。

使用$ZDATE代替實(shí)用程序

需要在$ZDATE函數(shù)和date實(shí)用程序之間進(jìn)行選擇時(shí)送丰,請(qǐng)記住以下幾點(diǎn):

  • 可以使用$ZDATE函數(shù)代替%DO%D實(shí)用程序的大多數(shù)現(xiàn)有入口點(diǎn)。
  • 可以直接調(diào)用$ZDATE($HOROLOG弛秋,7)而不是調(diào)用INT ^%D器躏。這以“ MM DD [YY] YY”格式提供當(dāng)前日期。
  • $ZDATEH$ZDATE比調(diào)用%DATE蟹略,%DI%DO的入口點(diǎn)快得多登失。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挖炬,隨后出現(xiàn)的幾起案子揽浙,更是在濱河造成了極大的恐慌,老刑警劉巖意敛,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馅巷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡草姻,警方通過(guò)查閱死者的電腦和手機(jī)钓猬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撩独,“玉大人敞曹,你說(shuō)我怎么就攤上這事∽郯颍” “怎么了澳迫?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)剧劝。 經(jīng)常有香客問(wèn)我纲刀,道長(zhǎng),這世上最難降的妖魔是什么担平? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任示绊,我火速辦了婚禮,結(jié)果婚禮上暂论,老公的妹妹穿的比我還像新娘面褐。我一直安慰自己,他們只是感情好取胎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布展哭。 她就那樣靜靜地躺著,像睡著了一般闻蛀。 火紅的嫁衣襯著肌膚如雪匪傍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天觉痛,我揣著相機(jī)與錄音役衡,去河邊找鬼。 笑死薪棒,一個(gè)胖子當(dāng)著我的面吹牛手蝎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俐芯,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棵介,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吧史?” 一聲冷哼從身側(cè)響起邮辽,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贸营,沒(méi)想到半個(gè)月后吨述,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莽使,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锐极,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芳肌。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灵再,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亿笤,到底是詐尸還是另有隱情翎迁,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布净薛,位于F島的核電站汪榔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肃拜。R本人自食惡果不足惜痴腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一雌团、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧士聪,春花似錦锦援、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至区岗,卻和暖如春略板,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慈缔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工叮称, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胀糜。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓颅拦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親教藻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子距帅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容