?
? ????? PHP ??? ???? ??? ?? ??
The date/time type inputs are all decoded using the following procedure.
日期/時間類型輸入都是使用下列過程進行解碼的。
把輸入的字符串分解為一個個記號,然后把每個記號分成字符串、時間、時區(qū)、數(shù)字幾類:
如果一個數(shù)字記號包含一個冒號(:),那么這是一個時間字符串。 包括隨后所有的數(shù)據(jù)位和冒號。
如果這個數(shù)字記號包含一個劃線(-)、斜杠(/)、 多個點(.),那么它就是一個日期字符串,可能有一個文本月份。 如果一個日期記號已經(jīng)看過,那么將被解析為時區(qū)名(比如 America/New_York)。
如果這個記號只是數(shù)字,那么它要么是一個單獨的字段, 要么是一個ISO8601連接的日期(比如19990113是 1999年1月13日)或者是連接的時間(比如141516 是 14:15:16)。
如果記號以一個加號(+)或減號(-)開頭, 那么它要么是一個時區(qū),要么就是一個特殊的字段。
如果記號是一個文本字符串,那么和可能的字符串進行匹配:
把這個記號當(dāng)作時區(qū)縮寫進行二分表查找。
如果沒有找到,再做一次二分表查找,看看這個記號是特殊字符串 (比如 today)、日期(比如 Thursday)、 月份(比如January),還是一個無關(guān)痛癢的字 (比如 at, on)。
如果還沒有找到,拋出一個錯誤。
如果記號是一個數(shù)字或者數(shù)字字段:
如果有八位或者六位數(shù)字,而且前面也沒有讀到其它日期字段, 那么就解釋成一個"concatenated date(連接的日期)"(比如 19990118or990118)。 這里的解析是YYYYMMDD或者YYMMDD。
如果記號是三位數(shù)字,并且已經(jīng)解碼了一個年份,那么解釋成一年中的日。
如果已經(jīng)讀取了四位或六位數(shù)字,并且已經(jīng)讀取了一個年份, 那么就解析成時間(HHMM 或者 HHMMSS).
如果是三位或更多位并且還沒有找到日期字段,則解析成一個年份 (這個解析強制剩余的日期字段的順序為yy-mm-dd)。
否則,日期字段的順序被認(rèn)為是尊循DateStyle 設(shè)置:mm-dd-yy,dd-mm-yy,yy-mm-dd 之一。如果發(fā)現(xiàn)月份或者日期字段超出范圍, 則拋出一個錯誤
如果聲明了BC,則對年份取其負(fù)數(shù)并加一,用于內(nèi)部保存。 因為在格里高利歷法里沒有零年,所以數(shù)字上的1BC是公元零年。
如果沒有聲明BC并且年份字段有兩個數(shù)據(jù)位的長度,那么把年份調(diào)整為4位。 如果該字段小于70,那么加2000,否則加1900 。
Tip: 格里高利年份AD1-99可以用前導(dǎo)零的方式使用4位數(shù)字 (也就是說0099 是 AD 99).