如何在Shell中格式化日期

时间:2018-10-05 08:42:36

标签: bash shell

我想将自定义日期格式DD-%%%-YYYY转换为标准日期格式:YYYYMMDD

%%%的可能值为:

Jan Fev Mar Avr Mai Jun Jui Aou Sep Oct Nov Dec

假设输入是bash变量,如何将其转换为标准格式?

示例:

$ fr_date='09-Aou-2018'
$ # [transformation]
# sql_date should now contain 20180809
$ echo "$sql_date"
20180809

2 个答案:

答案 0 :(得分:1)

您可以使用date实用程序。

fr_date='09-Aug-2018'
sql_date="$(date --date=$fr_date +%Y%m%d)"
echo $sql_date
20180809

有关更多信息,请参阅date man page

此外,date不支持自定义语言环境,格式必须与语言环境无关。尝试将日期存储为简单的Unix时代。

答案 1 :(得分:0)

解决方案1:将法语月份重写为英语,然后使用日期来读取和格式化它:

纯bash:

tmp=${fr_date/Fev/Feb} tmp=${tmp/Avr/Apr} tmp=${tmp/Mai/May}
tmp=${tmp/Jui/Jul} tmp=${tmp/Aou/Aug}
sql_date=$(date +%Y%m%d -d "$tmp")

使用sed:

tmp=$(sed 's/Fev/Feb;s/Avr/Apr;s/Mai/May;s/Jui/Jul;s/Aou/Aug' <<<"$fr_date")
sql_date=$(date +%Y%m%d -d "$tmp")

解决方案2:为每个月分配对应的编号:

#!/bin/bash
# Requires bash 4 for associative arrays
declare -A month_map=(
[Jan]=01 [Fev]=02 [Mar]=03 [Avr]=04 [Mai]=05 [Jun]=06
[Jui]=07 [Aou]=08 [Sep]=09 [Oct]=10 [Nov]=11[Dec]=12
)
IFS=- read -r day month year <<<"$fr_date"
sql_date=$year${month_map[$month]}$day