第八十三章 Caché 函数大全 $ZDATE 函数
文章目錄
- 第八十三章 Caché 函數大全 $ZDATE 函數
- 大綱
- 參數
- 描述
- 簡單的$ZDATE格式
- 可自定義日期默認
- 參數
- hdate
- dformat
- dformat Default
- dformat Settings
- monthlist
- yearopt
- startwin
- endwin
- mindate
- ODBC Date Format (dformat 3)
- maxdate
- erropt
- ZDateNull的無效日期處理
- localeopt
- 示例
- 日期格式示例
- 兩位數的年份滑動窗口示例
- 日期范圍示例
- 注意
- $ZDATE的值無效
- 使用`$ZDATE`代替實用程序
第八十三章 Caché 函數大全 $ZDATE 函數
驗證日期并將其從內部格式轉換為指定的顯示格式。
大綱
$ZDATE(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt) $ZD(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)參數
- hdate 一個整數,指定內部日期格式的值。該整數表示自1840年12月31日以來經過的天數。如果將$HOROLOG指定為hdate,則僅使用$HOROLOG的日期部分。請參閱下面的hdate。
- dformat 可選—一個整數代碼,指定返回日期的格式。請參閱下面的dformat。
- monthlist 可選-字符串或變量名稱,用于指定一組月份名稱。該字符串必須以分隔符開頭,并且其12個條目必須由該分隔符分隔。請參閱下面的月列表。
- yearopt 可選—整數代碼,用于指定是將年表示為兩位數字還是四位數字的值。請參閱下面的yearopt。
- startwin 可選-滑動窗口的開始,在此期間,日期必須用兩位數的年份表示。請參閱下面的startwin。
- endwin 可選-滑動窗口的末尾,其間用兩位數的年份表示日期。請參閱下面的endwin。
- mindate 可選-有效日期范圍的下限。指定為$HOROLOG整數日期計數,0表示1840年12月31日。可以指定為正整數或負整數。請參閱下面的提示。
- maxdate 可選-有效日期范圍的上限。指定為$HOROLOG整數日期計數。請參閱下面的maxdate。
- erropt 可選-當hdate無效時返回的表達式。為該參數指定值將抑制與無效或超出范圍的hdate值相關的錯誤代碼。 $ZDATE而不是發出錯誤消息,而是返回erropt。請參閱下面的錯誤提示。
- localeopt 可選-布爾值標志,用于指定dformat,monthlist,yearopt,minate和maxdate默認值以及其他日期特征(例如日期分隔符)使用的語言環境:localeopt = 0:當前的語言環境屬性設置確定這些參數默認值。localeopt = 1:ODBC標準語言環境確定這些參數默認值。未指定localeopt:dformat值確定這些參數默認值。如果dformat = 3,則使用ODBC默認值。日文和回教日期dformatvalues使用其自己的默認值。對于所有其他dformat值,當前的語言環境屬性設置用作默認值。請參閱下面的localeopt。
指定參數值之間的省略參數由占位符逗號指示。末尾的占位符逗號不是必需的,但允許使用。逗號之間允許有空格,以指示省略的參數。
描述
$ZDATE函數將內部存儲格式($HOROLOG格式)的指定日期轉換為幾種備用日期顯示格式之一。 $ZDATE返回的值取決于使用的參數。
簡單的$ZDATE格式
$ZDATE(hdate)是$ZDATE的最基本形式,它以與指定hdate對應的顯示格式返回日期。 hdate是自1840年12月31日起經過的天數的整數。范圍從0到2980013(從12/31/1840到12/31/9999)。
默認情況下,$ZDATE(hdate)用兩位數字表示1900年到1999年之間的年份。它用四位數字表示1900年之前或1999年之后的年份。例如:
/// d ##class(PHA.TEST.Function).ZDATE() ClassMethod ZDATE() {WRITE $ZDATE(21400),! ; returns 08/04/1899WRITE $ZDATE(50000),! ; returns 11/23/77WRITE $ZDATE(60000),! ; returns 04/10/2005WRITE $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當提供$HOROLOG日期到$ZDATE時,僅使用日期部分。以$HOROLOG格式,日期和時間顯示為兩個整數,中間用逗號分隔。遇到逗號(非數字字符)時,$ZDATE會忽略字符串的其余部分。在以下示例中,$ZDATE使用$HOROLOG格式值返回04/10/2005和當前日期:
DHC-APP>WRITE !,$ZDATE("60000,12345")04/10/2005 DHC-APP>WRITE !,$ZDATE($HOROLOG)11/06/2020可自定義日期默認
在Caché啟動時,默認日期格式被初始化為dformat = 1,這是帶有斜杠日期分隔符(MM / DD / [YY] YY)的美國日期格式。要將此格式和其他默認格式設置為當前語言環境的值,請設置以下全局變量:SET ^SYS("NLS","Config","LocaleFormat")=1。這會將所有進程的所有格式默認值設置為當前語言環境值。這些默認值將一直保留到更改此全局變量為止。
注意:本節介紹未定義localeopt或將其設置為0時應用的用戶語言環境定義。當localeopt = 1時,$ZDATE使用預定義的ODBC語言環境。
可以使用NLS(國家語言支持)覆蓋當前進程的格式默認值。可以將所有格式的默認值更改為指定語言環境的值,也可以更改單個格式的值。
- 要將所有格式默認值(包括日期格式默認值)設置為指定語言環境的屬性,請調用以下方法調用:SET fmt=##class(%SYS.NLS.Format).%New("lname") ,其中lname是所需語言環境的NLS名稱。 (例如,deuw =German,espw = Spanish,fraw = French,ptbw = Brazilian Portuguese,rusw = Russian,jpnw = Japanese。在管理門戶中找到完整的語言環境列表:System,Configuration,NLS Settings,Locale Definitions )要將這些默認設置設置為當前語言環境的屬性,請指定lname為“ current”或空字符串(“”)。
- 要將默認日期格式設置為指定的dformat格式,請調用SetFormatItem()方法:SET rtn=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",n),其中n是希望將其設為默認值的dformat值。
下面的示例演示如何將所有格式默認設置為俄語語言環境,以默認格式(俄語)從$ZDATE返回日期,然后將格式默認值重置為當前語言環境默認值。請注意,俄語語言環境使用句點而不是斜杠作為日期部分分隔符:
/// 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下面的示例演示如何設置各個格式的默認值。第一個$ZDATE以默認格式返回日期。第一個SetFormatItem()方法將默認值更改為dformat = 4或歐洲日期格式(DD / MM / [YY] YY),如第二個$ZDATE所示。第二個SetFormatItem()方法更改日期分隔符的默認值(這會影響dformat -1、1、4和15)。在此示例中,日期分隔符字符設置為點(“。”),如第三個$ZDATE所示。最后,該程序將還原原始日期格式值:
/// d ##class(PHA.TEST.Function).ZDATE2() ClassMethod ZDATE2() { InitialValsSET fmt=##class(%SYS.NLS.Format).GetFormatItem("DateFormat")SET sep=##class(%SYS.NLS.Format).GetFormatItem("DateSeparator")WRITE !,$ZDATE($HOROLOG) ChangeValsSET x=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",3)WRITE !,$ZDATE($HOROLOG)SET y=##class(%SYS.NLS.Format).SetFormatItem("DateSeparator",".")WRITE !,$ZDATE($HOROLOG) RestoreValsSET 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參數
hdate
內部日期格式值,表示自1840年12月31日以來經過的天數。默認情況下,它必須是0到2980013之間的整數。可以將hdate指定為數字,字符串文字或表達式。 Caché將hdate轉換為規范形式。它會在其第一個非數字字符處截斷數字字符串(例如$HOROLOG值)。它將非數字字符串評估為整數0。不解析為整數的浮點數將生成<ILLEGAL VALUE>錯誤。
默認情況下,最早的有效hdate為0(1840年12月31日)。默認有效日期范圍是0到2980013(含),包括從12/31/1840到12/31/9999的日期。默認情況下,日期限制為正整數,因為DateMinimum屬性默認為0。如果當前語言環境的DateMinimum屬性設置為更大或等于負整數,則可以將較早的日期指定為負整數。有效的最低DateMinimum值的最低值是-672045,對應于0001年1月1日。Caché使用了多功的格里高利歷,將格里高利歷回溯到“ Year 1”,符合ISO 8601標準。這在一定程度上是因為公歷是在不同國家的不同時間采用的。例如,許多歐洲大陸在1582年采用了它;大不列顛及美國在1752年采用了它。因此,當地采用格里高利歷之前的Caché日期可能與根據當時有效的當地歷法記錄的歷史日期不符。有關1840年之前的日期的更多詳細信息,請參考mindate參數。
CachéSQL支持Caché配置設置ZDateNULL。
- 當ZDateNULL = OFF(默認值)時,無效和超出范圍的hdate值的行為以及由此產生的錯誤如erropt參數中所述。
- 當ZDateNULL = ON時,無效和超出范圍的hdate值的行為以及由此產生的錯誤如下:
- 有效日期范圍是從1到94232(含),包括從01/01/1841到12/30/2098的日期。該日期范圍是為具有三個或更少參數的任何$ZDATE函數調用設置的。如果$ZDATE函數調用具有三個以上的參數,則有效的日期范圍是從mindate和maxdate參數(如果指定)中獲取的,或者從為當前語言環境建立的日期范圍中獲取。
- 無效的日期值將返回空字符串(“”),而不是發出錯誤。
dformat
返回日期的格式。有效值為:
| 1 | MM/DD/[YY]YY(07/01/97或03/27/2002)-美國數字格式。日期分隔符(/或.)。取自當前區域設置。 |
| 2 | DD Mmm [ YY ]YY (01 Jul 97 or 27 Mar 2002) |
| 3 | YYYY-MM-DD (1997-07-01 or 2002-03-27) ODBC格式。默認情況下,此格式與當前的語言環境設置(localeopt = 1)無關,從而以ODBC標準交換格式指定日期。要以這種格式使用當前的日期語言環境設置,請設置localeopt = 0。 |
| 4 | DD/MM/[YY]YY (01/07/97 or 27/03/2002) 歐洲數字格式。日期分隔符(/或。)取自當前的語言環境設置。 |
| 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) |
| 10 | W(2)-一周中的天數,從0(星期日)到6(星期六)編號。與$SYSTEM.SQL.DAYOFWEEK()方法進行比較。 |
| 11 | Www(Tue)-縮寫的日期名稱 |
| 12 | Wwwwww (Tuesday))—全天名稱 |
| 13 | [D]D/[M]M/YYYY (1/7/2549 or 27/11/2549) 泰文日期格式。除無前導零外,日和月與歐洲用法相同。該年是佛教時代(BE)年,通過在公歷年中增加543年而得出。 |
| 14 | nnn(354)-年的天數 |
| 15 | DD/MM/[YY]YY (01/07/97 or 27/03/2002) 歐洲格式(與dformat = 4相同)。日期分隔符(/或。)取自當前的語言環境設置。 |
| 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 | 從用戶的語言環境(如果localeopt = 0或未定義)或從ODBC語言環境(默認為dformat = 3)獲取有效的dformat值。如果dformat是從用戶的語言環境中獲取的,則它是fmt.DateFormat的值,其中fmt是與當前進程關聯的## class(%SYS.NLS.Format)的實例。如果不指定dformat,則這是默認行為。 |
其中
| YYYY | YYYY是四位數的年份。 [YY]如果hdate落在活動窗口內達兩位數年份,則YY為兩位數年份;否則為四位數年份。 |
| MM | 兩位數的月份:01到12。[M] M表示在月份1到9中省略了前導零。 |
| DD | 兩位數的日期:01到31。[D] D表示第1到9天省略了前導零。 |
| Mmm | 從當前語言環境的MonthAbbr屬性中提取的月份縮寫。可以從指定為$ ZDATE的monthlist參數的可選列表中提取備用月份的縮寫(或任何長度的名稱)。 MonthAbbr的默認值是:“Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec” |
| Mmmmm | 由當前語言環境的MonthName屬性指定的月份的全名。默認值為:“January February March … November December” |
| W | 數字0-6表示星期幾:Sunday=0, Monday=1, Tuesday=2, etc. |
| Www | 工作日名稱縮寫,由當前語言環境的WeekdayAbbr屬性指定。默認值為:“Sun Mon Tue Wed Thu Fri Sat” |
| Wwwwww | 由當前語言環境的WeekdayName屬性指定的工作日全名。默認值為:“Sunday Monday Tuesday … Friday Saturday” |
| nnn | 指定年份的天數,始終為三位數,如有必要,前導零。值是001到365(leap年時是366)。 |
dformat Default
如果省略dformat或將其設置為-1,則dformat的默認值取決于localeopt參數和NLS DateFormat屬性:
- 如果localeopt = 1,則dformat的默認值為ODBC格式。 monthlist,yearopt,mindate和maxdate參數的默認值也設置為ODBC格式。這與設置dformat = 3相同。
- 如果localeopt = 0或未指定,則dformat默認值來自NLS DateFormat屬性。如果DateFormat = 3,則dformat的默認值為ODBC格式。但是,DateFormat = 3不會影響在當前NLS語言環境定義中指定的monthlist,yearopt,mindate和maxdate參數默認值。
若要確定語言環境的默認日期格式,請調用GetFormatItem()NLS類方法:
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DateFormat")歐洲日期格式(dformat = 4,DD / MM / YYYY順序)是許多(但不是全部)歐洲語言的默認格式,包括英式英語,法語,德語,意大利語,西班牙語和葡萄牙語(使用“ /”日期分隔符)字符),以及捷克語(csyw),俄語(rusw),斯洛伐克語(skyw),斯洛文尼亞語(svnw)和烏克蘭語(ukrw)(使用“。” DateSeparator字符)。
dformat Settings
如果dformat為3(ODBC日期格式),則ODBC格式默認值也用于monthlist,yearopt,minate和maxdate參數默認值。當前的語言環境默認值將被忽略。
如果dformat為-1、1、4、13或15(數字日期格式),則$ZDATE使用當前語言環境的DateSeparator屬性的值作為月,日和年之間的分隔符。當dformat為3時,使用ODBC日期分隔符(“-”)。對于所有其他dformat值,空格用作日期分隔符。 DateSeparator的英語默認值為“ /”,并且所有文檔都使用此分隔符。
如果dformat是11或12(日期名稱)且localeopt = 0或未指定,則日期名稱值來自當前的語言環境屬性。如果localeopt = 1,則日期名稱來自ODBC語言環境。若要確定語言環境的默認工作日名稱和工作日縮寫,請調用以下NLS類方法:
WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayName"),!WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayAbbr"),!如果dformat為16或17(日語日期格式),則返回的日期格式與語言環境設置無關。可以從任何UnicodeCaché實例返回日語格式的日期。在8位Caché實例上,將dformat指定為16或17會導致錯誤。
如果dformat為18、19、20或21(伊斯蘭日期格式)且未指定localeopt,則參數默認為伊斯蘭默認值,而不是當前的語言環境默認值。 monthlist參數默認為阿拉伯語月份名稱,并用拉丁字符音譯。 tformat,yearopt,mindate和maxdate參數默認為ODBC默認值。日期分隔符默認為回教默認值(一個空格),而不是ODBC默認值或當前區域設置的DateSeparator屬性值。如果localeopt = 0,則將當前語言環境屬性默認值用于這些參數。如果localeopt = 1,則將ODBC默認值用于這些參數。
monthlist
該表達式可解析為月份名稱或月份名稱縮寫的字符串,以分隔符分隔。 monthlist中的名稱替換了來自當前語言環境的MonthAbbr屬性的默認月份縮寫值或來自MonthName屬性的月份名稱值。
僅當dformat為2、5、6、7、9、18或20時,monthlist才有效。如果dformat為任何其他值,$ZDATE將忽略monthlist。
月列表字符串具有以下格式:
-
字符串的第一個字符是定界符(通常為空格)。同一分隔符必須出現在月份列表的第一個月份名稱之前和每個月份名稱之間。可以指定任何單字符定界符;該分隔符出現在返回日期值的月,日和年部分之間,這就是為什么通常使用空格作為首選字符的原因。
-
月份名稱字符串應包含十二個分隔值,分別對應于一月到十二月。可以指定多于或少于十二個月的名稱,但是如果沒有對應于hdate中月份的月份名稱,則會生成<ILLEGAL VALUE>錯誤。
如果省略monthlist或將monthlist值指定為-1,則$ZDATE使用在當前語言環境的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 DecDHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthName"),!January February March April May June July August September October November December以下示例列出了月份名稱的默認語言環境,將此過程的語言環境更改為俄語語言環境,然后列出了俄語月份名稱并顯示了帶有俄語月份名稱的當前日期。然后,它將語言環境默認值恢復為當前語言環境,并再次顯示當前日期,這次是默認的月份名稱。
/// 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,這是一個整數代碼,用于指定將年顯示為兩位數值的時間窗口。對于所有其他dformat值,將忽略yearopt。有效的yearopt值為:
| -1 | 從當前語言環境的YearOption屬性獲取有效的yearopt值,該值默認為0。如果未指定yearopt,則這是默認行為。 |
| 0 | 除非有效的過程特定的滑動窗口(通過%DATE實用程序建立),否則用兩位數的年份表示20世紀日期(1900年至1999年),而所有其他日期則用4位年份表示。如果這樣的窗口有效,則僅將落在滑動窗口中的那些日期表示為兩位數年份,而將所有其他日期表示為四位數年份。 |
| 1 | 代表20世紀的日期用兩位數的年份表示,其他所有日期用4位數的年份表示。 |
| 2 | 用兩位年份表示所有日期。 |
| 3 | 這些日期用兩位數的年份表示由startwin和(可選)endwin定義的滑動時間范圍內的日期。用四位數字的年份表示所有其他日期。當yearopt = 3時,startwin和endwin是$HOROLOG格式的絕對日期。 |
| 4 | 用四位數年份表示所有日期。 ODBC年選項。 |
| 5 | 用兩位數年份表示所有日期,它們都落在startwin和(可選)endwin定義的滑動時間窗口內。用四位數字的年份表示所有其他日期。當yearopt = 5時,startwin和endwin是相對年份。 |
| 6 | 用兩位數字年份代表當前世紀的所有日期,而用四位數年份代表所有其他日期。 |
若要確定語言環境的默認年份選項,請調用GetFormatItem()NLS類方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("YearOption") 0如果省略yearopt或將yearopt值指定為-1,則$ZDATE使用當前語言環境的YearOption屬性,除非滿足以下條件之一:如果localeopt = 1,則yearopt默認為ODBC year選項。如果localeopt = 0或未指定,并且dformat是18、19、20或21(伊斯蘭日期格式),則yearopt的默認值為ODBC year選項(4位數字的年份);否則,默認值為ODBC年。回教日期將忽略YearOption屬性值。
解決2000年以前的年份是2位數
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/1966startwin
一個數字值,指定滑動窗口的開始,在此期間,日期必須用兩位數的年份表示。請參閱參數部分。當yearopt為3或5時,必須提供startwin。startwin不適用于任何其他yearopt值。
當yearopt = 3時,startwin是$HOROLOG日期格式的絕對日期,指示滑動窗口的開始日期。
當yearopt = 5時,startwin是一個數字值,表示滑動窗口的開始年份,表示為當前年份之前的年數。滑動窗口始終從startwin中指定的一年的1月1日開始。
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的日期部分。早于mindate指定hdate值會生成錯誤。
以下是受支持的提示值:
- 正整數:最常見的正念指定為正整數,以建立最早的允許日期為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).ZDATE5() ClassMethod ZDATE5() {SET min=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")WRITE "初始DateMinimum值為 ",min,! Permit18thCenturyDatesSET x=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-51498)SET newmin=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")WRITE "設置DateMinimum值為 ",newmin,!! RestrictTo19thCenturyDatesWRITE $ZDATE(-13000,1,,,,,-14974),!! ResetDateMinimumToDefaultSET oldmin=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",min)WRITE "從重置DateMinimum值",oldmin," to ",min } DHC-APP>d ##class(PHA.TEST.Function).ZDATE5() 初始DateMinimum值為 0 設置DateMinimum值為 -5149805/29/1805從重置DateMinimum值-51498 to 0可以指定有或沒有maxdate的提示。指定大于maxdate的提示時,會產生<ILLEGAL VALUE>錯誤。
ODBC Date Format (dformat 3)
DateMinimum屬性的應用由localeopt設置控制。當localeopt = 1(dformat = 3的默認值)時,無論當前的區域設置如何,最小日期均為0。因此,采用ODBC格式(dformat = 3),可以使用以下命令指定1840年12月31日之前的日期:
- 指定早于指定日期的提示:
- 指定早于指定日期的DateMinimum屬性值,并設置localeopt = 0:
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)的最大日期是$HOROLOG 2781687,對應于BE 31/12/9999。
指定大于maxdate的hdate會產生<VALUE OUT OF RANGE>錯誤。
如果指定的最大日期大于2980013,則會產生<ILLEGAL VALUE>錯誤。
可以指定maxdate或不指定。指定的maxdate小于mindate會生成<ILLEGAL VALUE>錯誤。
erropt
為該參數指定值將抑制與無效或超出范圍的hdate值相關的<ILLEGAL VALUE> <VALUE OUT OF RANGE>錯誤。 $ZDATE函數返回錯誤值,而不是生成或錯誤。
- 驗證:Caché對hdate執行規范的數字轉換。 hdate字符串的解析在第一個非數字字符處停止。因此,hdate字符串(例如64687AD)與64687相同。非數字日期(包括空字符串)的計算結果為0。因此,空字符串hdate返回$HOROLOG初始日期:1840年12月31日。但是,如果hdate不會計算為整數(包含非零小數),它會生成<ILLEGAL VALUE>錯誤。
- 范圍:hdate必須計算為mindate / maxdate范圍內的整數。默認情況下,大于2980013或小于0的日期值會生成錯誤。通過將mindate設置為負數,可以擴展1840年12月31日之前的有效日期范圍。但是,對于dformat 18、19、20或21(回教伊斯蘭歷)日期,-445031之前的任何日期都會生成即使將mindate設置為較早的日期,也會出現<ILLEGAL VALUE>錯誤。
erropt參數僅抑制由于hdate的無效值或超出范圍的值而生成的錯誤。無論是否提供錯誤提示,由于其他參數無效或超出范圍而產生的錯誤將始終產生錯誤。
例如,當$ZDATE指定一個滑動窗口,其中endwin早于startwin時,總是生成<ILLEGAL VALUE>錯誤。同樣,當maxdate小于mindate時,會生成<ILLEGAL VALUE>錯誤。
ZDateNull的無效日期處理
可以使用ZDateNull設置$ZDATE的行為,為hdate賦予無效值時。若要為當前進程設置此行為,請使用%SYSTEM.Process類的ZDateNull()方法。可以通過設置Config.Miscellaneous類的ZDateNull屬性來建立系統范圍的默認行為。 $ZDATE可以發出錯誤,也可以返回空值。
系統范圍的默認行為是可配置的。轉到管理門戶,選擇“系統”,“配置”,“兼容性設置”。查看和編輯ZDateNull的當前設置。默認值為“false”,表示$ZDATE返回錯誤。
localeopt
此布爾值參數將用戶的當前語言環境定義或ODBC語言環境定義指定為語言環境指定的參數dformat,monthlist,yearopt,minate和maxdate的默認值的來源:
- 如果localeopt = 0,則所有這些參數均采用當前的語言環境定義默認值。
- 如果localeopt = 1,則所有這些參數均采用ODBC默認值。
- 如果未指定localeopt,則dformat參數確定這些參數的默認值。如果dformat = 3,則使用ODBC默認值。如果dformat為18、19、20或21,則無論當前語言環境定義如何,都使用回教日期格式默認值。對于所有其他dformat值,使用當前的語言環境定義默認值。
不能更改ODBC語言環境。它用于格式化日期字符串,這些日期字符串在選擇了不同的國家語言支持(NLS)的Caché流程之間可移植。如果localeopt = 1,則ODBC區域設置日期定義如下:
- 日期格式默認為3。因此,如果dformat未定義或為-1,則使用日期格式3。
- 日期分隔符默認為“/”。但是,日期格式默認為3,該格式始終使用“-”作為日期分隔符。
- Year選項默認為4位數字。
- 最小和最大日期:0和2980013($HOROLOG日期計數)。
- 使用英語月份名稱,月份縮寫,工作日名稱和工作日縮寫。
示例
日期格式示例
下面的示例說明$ZDATE如何返回當前日期的各種dformat格式。 yearopt采用默認值。當然,日期分隔符以及月份和星期幾的名稱和縮寫取決于語言環境。本示例使用當前的用戶區域設置定義:
/// 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下面的示例將日期與區域設置進行比較,該區域設置默認為當前用戶區域設置與日期(當localeopt = 1激活ODBC區域設置定義時)。為了使該示例更有趣,將當前用戶區域設置設置為法語:
/// 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-111: 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日兩位數的年份滑動窗口示例
為了說明如何使用顯式滑動窗口,假設在1997年輸入以下函數調用。59461的日期表示2003年10月19日; hd的日期為2003年10月19日。 dformat 1允許它返回兩位數或四位數的年份,yearopt 5可以指定四位數年份的滑動窗口。由于使用了yearopt設置,因此通過加法和減法來計算相對于當年(在本例中為1997)的startwin和endwin。
DHC-APP>WRITE $ZDATE(59461,1,,5,90,10) 10/19/03用于將年份顯示為兩位數的滑動窗口從1/1/1907擴展到12/31/2006。因此,Caché將日期顯示為10/19/03。
日期范圍示例
下面的示例使用mindate和maxdate測試可能的出生日期。 maxdate假定出生日期不能在將來。這位思想家假設列出的任何人都不會超過124歲。日期以$HOROLOG格式指定:
/// d ##class(PHA.TEST.Function).ZDATE8() ClassMethod ZDATE8() {SET bdateh(1)=62142SET bdateh(2)=16800SET bdateh(3)=70000DO $SYSTEM.Process.ZDateNull(1)SET maxdate=$PIECE($HOROLOG,",",1)+1SET 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輸入值中有兩個不在出生日期測試的日期范圍之內:16800(12/30/1886)在124年前,而70000(08/26/2032)在將來。默認情況下,這些$ZDATE調用將生成錯誤,但是由于設置了ZDateNull(1),它們將返回空字符串(“”)。
注意
$ZDATE的值無效
在以下情況下,收到<FUNCTION> 錯誤:
- 如果指定了無效的dformat代碼(小于-1或大于17的整數值,或者非整數值)。
- 如果在yearopt為3或5時未指定startwin值。
在以下情況下,會收到<ILLEGAL VALUE>錯誤:
- 如果為hdate指定了無效值,并且不提供錯誤值或設置ZDateNull(如下所述)。
- 如果給定的月份數大于monthlist中的月份數。
- 如果maxdate小于主意。
- 如果endwin小于startwin。
- 如果startwin和endwin指定滑動時間窗口,其持續時間大于100年。
在以下情況下,收到<VALUE OUT OF RANGE>錯誤:
- 如果指定的hdate值超出有效日期范圍。對于標準Caché,它是0到298013。對于ISM兼容的Caché,它是1到94232。可以使用%SYSTEM.Process類的ZDateNull()方法來設置日期范圍和當前進程的無效日期行為。
- 如果指定的其他有效日期超出了為maxdate和mindate假定的值所定義的范圍,并且不提供錯誤的值。
使用$ZDATE代替實用程序
需要在$ZDATE函數和date實用程序之間進行選擇時,請記住以下幾點:
- 可以使用$ZDATE函數代替%DO或%D實用程序的大多數現有入口點。
- 可以直接調用$ZDATE($HOROLOG,7)而不是調用INT ^%D。這以“ MM DD [YY] YY”格式提供當前日期。
- $ZDATEH和$ZDATE比調用%DATE,%DI或%DO的入口點快得多。
總結
以上是生活随笔為你收集整理的第八十三章 Caché 函数大全 $ZDATE 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.12用lambda表达式对列表进行排
- 下一篇: python爬虫京东口红销售排行