在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"的实施方式是2​​4小时减24小时, 2013-03-11 0:35 CDT2013-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天