簡體   English   中英

在 Bash 中獲取日期(當前時間的前一天)

[英]Get the date (a day before current time) in Bash

如何在 Bash 中打印當前時間前一天的日期?

如果您有 GNU 日期並且我正確理解您

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

或者

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

如果您有 BSD (OSX) date您可以這樣做:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

或者,如果您想在任意日期進行日期計算:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
date --date='-1 day'

MAC OSX

對於昨天的日期:

date -v-1d +%F

其中1d定義當前日期減去 1 天。 相似地,

date -v-1w +%F - 上周日期

date -v-1m +%F - 上個月的日期

如果您有 GNU 日期,

date --date="1 day ago"

更多信息: https : //www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

嗯,這是一個遲到的答案,但這似乎有效!!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;

高級 Bash 腳本指南

date +%Y:%m:%d -d "yesterday"

有關日期格式的詳細信息請參見手冊頁日期

date --date='-1 day'

抱歉沒有在 Solaris 系統上提及 I。 因此,-date 開關在 Solaris bash 上不可用。

我發現我可以通過時區的小技巧獲得上一個日期。

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

也許改用 Perl?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

或者,使用 nawk 和(ab)使用 /usr/bin/adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

也遇到了這個……瘋了!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
date -d "yesterday" '+%Y-%m-%d'

或者

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date

\n
date --date='-1 day'\n
\n

#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day
yesterday=`date -d "-1 day" %F`

將 YYYY-MM-DD 格式的昨天日期放入變量$yesterday

不是很性感,但可以勝任:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

從“馬丁克萊頓”的答案形成。

如果所選日期格式為“YYYYMM”,您可以使用正則表達式進行簡單計算:

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

2020 年 1 月,它將返回 201912 ;-) 但是,這只是一種解決方法,當 date 沒有計算選項並且其他 dateinterpreter 選項(例如使用 perl)不可用時;-)

如果您使用的是 OSX,但您需要創建兼容 GNU,請先安裝 coreutils

brew install coreutils

然后編輯您的個人資料:

#gnu coreutils first
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

重新啟動您的終端,現在您可以使用 GNU 格式:

date +%Y-%m-%d -d "-2 day"

試試下面的代碼,它也負責 DST 部分。

if [ $(date +%w) -eq $(date -u +%w) ]; then
  tz=$(( 10#$gmthour - 10#$localhour ))
else
  tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

Courtsey安斯加爾Wiechers

DST 感知解決方案:

操縱時區可以改變幾個小時的時鍾。 由於夏令時,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

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
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM