Shell-Script
在 bash LINUX 中將日期從 DD-MM-YYYY 轉換為 YYYY-MM-DD 格式
設想:
我正在將文件中的日期值提取到變數中,預設情況下它採用 DD-MM-YYYY 格式。我必須從系統日期中減去這個日期。如果我的兩個日期都是 DD-MM-YYYY 格式,則減法會給出不正確的結果。所以我在Google上讀了一點,並決定將兩個日期格式化為 YYYY-MM-DD,因為這將在減法後給出正確的值。我在 YYYY-MM-DD 中成功格式化了系統日期,但是很難將從文件中獲得的日期轉換為 YYYY-MM-DD 格式。
以下解決方案適用於單個數字日期:
$ date -d $(sed "s/-/\//g" <<< '9-2-1832') +%Y-%m-%d Output : 1832-09-02
但是當我嘗試將日期轉換為兩位數時,如下所示:
$ date -d $(sed "s/-/\//g" <<< '19-07-2021') +%Y-%m-%d
我得到輸出
Invalid date '19/07/2021'
在哪裡:
19 - is Date of a month 07 - is Month i.e. July in this case. 2021 - is Year
所需的輸出為 ->
2021-07-19
我在 RH Linux 上工作,日期版本為:date (GNU coreutils) 8.22
請幫助提供上述問題的解決方案。
在您的情況下,
awk
可能是更好的方法:$ awk -F'-' '{printf("%04d-%02d-%02d\n",$3,$2,$1)}' <<< '19-07-2021' 2021-07-19
您可以切換到
date
允許指定輸入格式的 busybox:$ date=19-7-2021 $ busybox date -D %d-%m-%Y -d "$date" +%F 2021-07-19
(請注意它不會接受
019-007-2021
例如日期)。與 ast-open 實現相同
date
(不太可能在您的 RedHat 系統上開箱即用):$ date -p %d-%m-%Y -d "$date" +%F 2021-07-19
如果你使用的是 BSD 而不是 GNU 系統,你會這樣做:
$ date -jf %d-%m-%Y -- "$date" +%F 2021-07-19
或者您可以切換到內置的日期解析和格式設置,
zsh
而不是bash
原樣:$ zmodload zsh/datetime $ strftime -rs t %d-%m-%Y $date && strftime %F $t 2021-07-19
(
strftime
作為可以訪問標準strftime()
和strptime()
(使用-r
)API 的內置函式)。它還具有適當的拆分運算符和 a
printf
可以以任意順序接受參數(使用%n$...
在大多數實現中找到的語法,printf()
包括 GNUprintf()
,但不是printf
內置的bash
或 GNUprintf
獨立實用程序),並且它不將帶有前導零的數字視為預設八進制:$ printf '%3$04d-%2$02d-%1$01d\n' ${(s[-])date} 2021-07-19
或使用匿名函式:
$ (){ printf '%04d-%02d-%02d\n' $3 $2 $1; } ${(s[-])date} 2021-07-19
或者在這裡,數組反轉運算符:
$ printf '%04d-%02d-%02d\n' ${(s[-]Oa)date} 2021-07-19