从给定日期获取下周六的日期

shi*_*hiv 5 shell-script date

我想要给定日期之后下一个星期六的日期。例如,对于$date1="30-AUG-2015",我想要结果 05-SEP-2015。

我已经尝试了以下所有命令但没有成功:

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date='"$date1" +next Saturday')
date: invalid date ‘"$date1" +next Saturday’

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date1='next Saturday')
date: unrecognized option '--date1=next Saturday'
Try 'date --help' for more information.

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date -d "$date1 next saturday"
Sun Aug 30 00:00:00 IST 2015
samba@samba:~$ $date1 -d "next saturday"
30-AUG-2015: command not found
Run Code Online (Sandbox Code Playgroud)

mat*_*tdm 7

对于这样的事情,我强烈推荐dateutils。(yum install dateutils在带有 EPEL 的 Fedora 21+ 或 CentOS/RHEL 7 上。)。在基于 Debian 的系统上,该包也被称为,dateutils但命令以 为前缀,dateutils.以消除其中一些与无关包中具有相同名称的命令的歧义(替换daterounddateutils.dround下面)。

然后,只需执行以下操作:

dateround today sunday
Run Code Online (Sandbox Code Playgroud)

您可以使用“今天”或替换为实际日期:

$ dateround 2015-08-30 saturday
2015-09-05
Run Code Online (Sandbox Code Playgroud)

如果您需要输入日期为特定格式,例如 30-AUG-2015,您可以使用-ior--input-format选项,例如:

$ dateround -i '%d-%b-%Y' 30-AUG-2015 saturday
2015-09-05
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 4

ksh93

$ LC_ALL=C ksh93 -c 'printf "%(%c)T\n" "30-Aug-2015 Saturday"'
Sat Sep  5 00:00:00 2015
Run Code Online (Sandbox Code Playgroud)

请注意,如果日期是星期六,那么它将在同一天返回,如果您想要下一个星期六,请执行以下操作:

LC_ALL=C printf "%(%c)T\n" "30-Aug-2015 tomorrow Saturday"
Run Code Online (Sandbox Code Playgroud)

替换%cstrftime您想要的规格:

$ LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
10-Jan-2015
Run Code Online (Sandbox Code Playgroud)

为此10-JAN-2015,请将其分配给使用以下命令声明的变量typeset -u

typeset -u date=${
  LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
}
Run Code Online (Sandbox Code Playgroud)

通过 GNU 实现date

$ d=03-JAN-2015
$ LC_ALL=C date -d "$d +1 week -$(date -d "$d +1 day" +%w) day" '+%d-%^b-%Y'
10-JAN-2015
Run Code Online (Sandbox Code Playgroud)

  • @shiv,请参阅编辑。 (2认同)