从不同格式的变量中提取日期

Pra*_*hat 11 shell string date

让我向你解释问题

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %F' -d "$d"
Today is 2013-12-31
Run Code Online (Sandbox Code Playgroud)

此解决方案对应于当前日期。

但是我有一个存储当前日期以外的日期的变量

$Prev_date="Wed Dec 25 06:35:02 EST 2013" 
Run Code Online (Sandbox Code Playgroud)

我正在寻找将这个日期读取为 2013-12-25 并将其存储在变量中的解决方案。

我试过这个:

a=`date --date=$Prev_date '+%y/%m/d'`
echo $a
Run Code Online (Sandbox Code Playgroud)

它给出了这个错误:

date: illegal option -- date=Wed
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
Run Code Online (Sandbox Code Playgroud)

rep*_*lay 11

我假设你在谈论 Bash。如果是这样,那么您缺少"参数的--date参数周围。

代替

a=`date --date=$Prev_date '+%y/%m/d'`
Run Code Online (Sandbox Code Playgroud)

尝试这个

a=`date --date="$Prev_date" '+%y/%m/d'`
Run Code Online (Sandbox Code Playgroud)

我猜d应该有一个%. 那么它会是这样的:

a=`date --date="$Prev_date" '+%y/%m/%d'`
Run Code Online (Sandbox Code Playgroud)

您的错误向您显示 date 命令的用法的原因如下:

如果没有"around $Prev_date,变量将被替换,命令如下所示:

a=`date --date=Wed Dec 25 06:35:02 EST 2013 '+%y/%m/d'`
Run Code Online (Sandbox Code Playgroud)

因此,只有Wed被作为 的参数--date,而$Prev_date字符串的所有其他部分都被视为 date 命令的单独参数。所以 date 说它不知道调用的参数Dec并向您显示它的帮助输出。


Sté*_*las 5

-d选项是特定于 GNU 的。

在这里,你不需要做日期计算,只需重写已经包含所有信息的字符串:

a=$(printf '%s\n' "$Prev_date" | awk '{
  printf "%04d-%02d-%02d\n", $6, \
  (index("JanFebMarAprMayJunJulAugSepOctNovDec",$2)+2)/3,$3}')
Run Code Online (Sandbox Code Playgroud)


jan*_*nos 5

如果我理解正确的话,您想要保存日期,以便以后可以重复使用它以不同的格式打印相同的日期。为此,我建议将日期保存为易于命令解析的格式date -d,并让date命令进行格式化。

据我所知,该格式+%Y%m%d %H:%M:%S是最独立于平台的。因此,让我们以这种格式保存日期:

d=$(date '+%Y%m%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

然后您可以以不同的格式打印该日期,例如:

$ date +%c -d "$d"
Tue 31 Dec 2013 01:13:06 PM CET
$ date +'Today is %A' -d "$d"
Today is Tuesday
$ date +'Today is %F' -d "$d"
Today is 2013-12-31
Run Code Online (Sandbox Code Playgroud)

更新

如果给您一个像 之类的日期字符串Wed Dec 25 06:35:02 EST 2013,那么您可以尝试使用 解析它date -d并更改其格式,例如:

$ date +%F -d 'Wed Dec 25 06:35:02 EST 2013'
2013-12-25
Run Code Online (Sandbox Code Playgroud)

这适用于 GNU 日期。如果它在您的系统中不起作用,您可以尝试该gdate命令,通常它存在于现代系统中。