linux的shell中,日期格式校驗

2021-08-23 13:22:22 字數 1504 閱讀 1935

在shell裡對日期格式,有效性的檢查,在網上搜了一下,對有效性檢查,很多都是借助cal命令的輸出,來檢查日期是否有效,比如

這樣: cal 2 2008|grep -q "\<29" && echo ok || echo error ,道理就是把年月日拆分開,在cal的某年某月的輸出中去找日期,但仔細想一下,這種方法有問題,cal的輸出一般是下面這樣的,

2月 2008

日 月 火 水 木 金 土

1 23 4 5 6 7 8 9

10 11 12 13 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28 29

如果校驗2023年2月29號,我們在cal輸出中可以找到29,則校驗合法。看起來貌似沒有問題,試想如果我要檢查2023年2月29日的話,就會有問題了,cal 2 2902的輸出如下:

2月 2902

日 月 火 水 木 金 土

1 2 3 4

5 6 7 8 9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28

此時29號是個無效的日期,而輸出中的年2902中含有29這個字串,所以會產生錯誤的檢查。所以要使用cal來檢查日期合法性,可能在grep使用上還需要改進,比如能否從文字的末尾開始搜尋等等,或者找到兩行以上匹配項等,這裡本人grep也懂個皮毛,就不說了。

下面說說其他的方法來實現日期合法性檢查,shell中有個date命令,我能可以使用date命令的輸出來檢查,試一下 date -d "2008-02-30" "+%f"

有意思的是我們得到2008-03-01的輸出,如果輸入了合法的日期,輸出將和我們給定的日期一致。雖然這樣我們還是可以使用grep命令結合起來檢查,

例如: date -d "

2008-02-30

" "+%f"|grep -q "

2008-02-30"

如果我們要檢查的日期串和輸出中串能匹配上,我們就認為時間是合法的,下面是我寫的乙個函式:

function isvaliddate()

不過好像date命令表示的時間範圍是有限的,具體資料也沒有查到,試了一下好像是2023年到2023年之間,之外會認為無效日期。

如果要對日期格式檢查,注意,這裡只是對日期顯示格式進行檢查。也可以使用grep命令,用正規表示式來匹配,這裡也記錄一下實驗過的幾種方法:

echo "2003-12-23" | grep '^[1-9][0-9]\-[0-1][0-9]-[0-9]\$' 匹配yyyy-mm-dd格式,注意這裡的年是大於等於2023年的,如果不希望輸出,可以給grep加-q引數。^和$匹配開始和結束,\匹配 連續3個數字。

echo "2888-12-31" | egrep "([0-9][0-9][0-9][0-9])-(0[1-9]|[1][0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"

這種匹配可以檢查到月必須是1到12,日必須是1到31,不過仍然只是格式檢查,沒有合法性檢查。

shell中日期操作

1.date d操作 date y m d d n days 今天的後n天日期 date y m d d n days 今天的前n天日期 2.常用日期格式輸出 date f 輸出 2012 06 08 date d 輸出 06 08 12 date y m d h m s 輸出 20120608 0...

shell中日期時間操作

使用許可權 所有使用者 使用方式 date u d datestr s datestr utc universal date datestr set datestr help version format mmddhhmm cc yy ss 說明 date 能用來顯示或設定系統的日期和時間,在顯示方...

Oracle中日期的計算

日期格式引數含義說明 d 一周中的星期幾 day 天的名字,使用空格填充到9個字元 dd 月中的第幾天 ddd 年中的第幾天 dy 天的簡寫名 iw iso標準的年中的第幾周 iyyy iso標準的四位年份 yyyy 四位年份 yyy,yy,y 年份的最後三位,兩位,一位 hh 小時,按12小時計 ...