我有一个在Linux上运行的shell脚本,并使用此调用以YYYY-MM-DD格式获取昨天的日期:
date -d "1 day ago" '+%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)
它大部分时间都可以工作,但是当脚本在昨天早上运行时,2013-03-11 0:35 CDT它返回"2013-03-09"而不是"2013-03-10".
大概是夏令时(从昨天开始)应该归咎于.我猜的方式"1 day ago"来实现它减去24小时,前24小时2013-03-11 0:35 CDT是2013-03-09 23:35 CST,这导致的结果"2013-03-09".
那么,什么是一个很好的DST安全方式来获取昨天在Linux上使用bash的日期?
tin*_*ink 239
我认为这应该有效,无论你多久经营一次......
date -d "yesterday 13:00" '+%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)
小智 49
Mac OSX下的Bash略有不同.
对于昨天
echo `date -v-1d +%F`
Run Code Online (Sandbox Code Playgroud)
对于上周
echo `date -v-1w +%F`
Run Code Online (Sandbox Code Playgroud)
per*_*eal 11
这也应该有效,但可能太多了:
date -d @$(( $(date +"%s") - 86400)) +"%Y-%m-%d"
Run Code Online (Sandbox Code Playgroud)
如果您确定脚本在一天的前几个小时运行,您可以简单地执行
date -d "12 hours ago" '+%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果脚本每天在 00:35 运行(通过 crontab?),您应该问问自己,如果 DST 更改落在那个小时内会发生什么;脚本无法运行,或在某些情况下运行两次。现代的实现cron是相当聪明在这方面,虽然。
date -d "yesterday" '+%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)
稍后使用它:
date=$(date -d "yesterday" '+%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)
这是一个也适用于 Solaris 和 AIX 的解决方案。
操纵时区可以改变几个小时的时钟。由于夏令时,24 小时前可以是今天或前天。
你确定昨天是 20 或 30 小时前。哪一个?嗯,不是今天的最新的。
echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
Run Code Online (Sandbox Code Playgroud)
bash 需要使用 echo 命令中使用的 -e 参数,但不适用于 ksh。在 ksh 中,您可以使用没有 -e 标志的相同命令。
当您的脚本将在不同环境中使用时,您可以使用 #!/bin/ksh 或 #!/bin/bash 启动脚本。您还可以用换行符替换 \n:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
Run Code Online (Sandbox Code Playgroud)
您可以使用
date -d "30 days ago" +"%d/%m/%Y"
Run Code Online (Sandbox Code Playgroud)
要获取 30 天前的日期,同样您可以用 x 天数替换 30