Bash如何将日期转换为其他格式的变量

时间:2019-04-26 19:04:57

标签: bash

我尝试在下面执行此操作,但日期有一个错误:无效的日期'10 / 04/2019'

#Ask for the date to search
#echo "Date to look for dd/mm/yyyy"
read -p "Date to look for:" InitDate
echo $InitDate

#convert the date to yyyy-mm-dd
InitDate1=$(date -d $InitDate '+%Y%m%d')
echo $InitDate1

如何在变量中将10/04/2019转换为20190419。

3 个答案:

答案 0 :(得分:2)

GNU的date实用程序有点奇怪,它的--date参数接受各种奇怪的输入,并且不接受各种各样的“看起来不错”的输入。

来自man date

The --date=STRING is a mostly free format human readable date string
such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or
 even "next Thursday". ...

并尝试仅使用该格式。在您的情况下,我会这样做:

IFS='/' read -r day mon year <<<"$InitDate"
InitDate1=$(date --date "$year-$month-$day 00:00:00" '+%Y%m%d')

您还可以使用例如bash子字符串(例如ex)提取daymonyear路径。 day=${InitDate:1:4} mon=${InitDate:5:2} year=${InitDate:7:2}

但是由于您已经拥有yyyymmdd格式的日期,因此完全不需要使用date。只是:

IFS='/' read -r day mon year <<<"$InitDate"
echo "$year$mon$day"

答案 1 :(得分:0)

如果您要做的只是重新排列字符串中的日/月/年,则可以通过字符串操作轻松完成。例如:

echo '10/04/2019' | sed -E 's/([0-9]+)\/([0-9]+)\/([0-9]+)/\3\2\1/'

如果您确实需要将其导入到date实用程序中(进行更高级的转换,例如自转换以来数秒),则应查看手册页,因为实现因系统而异。

答案 2 :(得分:0)

感谢您的帮助。

我已经做到了:

<code>
#!/bin/sh
#ask the date
read -p "Date a rechercher:" InitDate
#conversion
InitDate1=$(echo $InitDate | sed -E 's/([0-9]+)\/([0-9]+)\/([0-9]+)/\3-\2-\1/')
echo $InitDate1
InitDate2=$(echo $InitDate | sed -E 's/([0-9]+)\/([0-9]+)\/([0-9]+)/\3\2\1/')
echo $InitDate2
</code>

尼古拉斯