在Linux上使用bash获取昨天的date,DST安全
我有一个在Linux上运行的shell脚本,并使用此调用以YYYY-MM-DD
格式获取昨天的date:
date -d "1 day ago" '+%Y-%m-%d'
它大部分时间工作,但是当脚本昨天早上在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昨天的date?
我认为这应该工作,无论多久和何时运行…
date -d "yesterday 13:00" '+%Y-%m-%d'
Bash在Mac OSX下略有不同。
昨天
echo `date -v-1d +%F`
上周
echo `date -v-1w +%F`
这也应该可以,但也许是太多了:
date -d @$(( $(date +"%s") - 86400)) +"%Y-%m-%d"
如果您确定脚本在一天的头几个小时内运行,您可以简单地做
date -d "12 hours ago" '+%Y-%m-%d'
顺便说一下,如果脚本每天在00:35运行(通过crontab?),你应该问自己,如果DST变化在那个小时内将会发生什么? 脚本无法运行,或在某些情况下运行两次。 尽pipe如此, cron
现代实现在这方面相当聪明 。
这里有一个可以和Solaris和AIX一起工作的解决scheme。
操作时区可能会在几个小时内改变时钟。 由于夏令时,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
在echo命令中使用的-e参数是bash所必需的,但是不适用于ksh。 在ksh中,可以使用相同的命令,而不使用-e标志。
当您的脚本将在不同的环境中使用时,您可以使用#!/ bin / ksh或#!/ bin / bash启动脚本。 您也可以用换行符replace\ n:
echo "$(TZ=GMT+30 date +%Y-%m-%d) $(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
您可以使用
date -d "30 days ago" +"%d/%m/%Y"
从30天前得到date,同样可以用x天数代替30天