我想要给定日期之后下一个星期六的日期。例如,对于$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)
对于这样的事情,我强烈推荐dateutils。(yum install dateutils在带有 EPEL 的 Fedora 21+ 或 CentOS/RHEL 7 上。)。在基于 Debian 的系统上,该包也被称为,dateutils但命令以 为前缀,dateutils.以消除其中一些与无关包中具有相同名称的命令的歧义(替换dateround为dateutils.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)
和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)
替换%c为strftime您想要的规格:
$ 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)