Shell-Script

在 bash LINUX 中將日期從 DD-MM-YYYY 轉換為 YYYY-MM-DD 格式

  • August 26, 2021

設想:

我正在將文件中的日期值提取到變數中,預設情況下它採用 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 的內置函式)。

它還具有適當的拆分運算符和 aprintf可以以任意順序接受參數(使用%n$...在大多數實現中找到的語法,printf()包括 GNU printf(),但不是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

引用自:https://unix.stackexchange.com/questions/659287