Bashで日付(現在時刻の前日)を取得する


171

Bashで現在時刻の1日前の日付を印刷するにはどうすればよいですか?


試した日付ですが、Solaris 10のbashに-dスイッチがないようです
conandor 2009年

sunfreewareからgnu date(coreutilパッケージ)をインストールすることで、別の素晴らしい解決策を見つけました。
conandor 2010

また、AIXの日付に-dスイッチはありません
フランクスター'19年

--dateまたは-dオプションGNU日付でのみ利用可能です
クリス・ジョンソンFA

この質問のDST対応バージョンについては、stackoverflow.com / q / 15374752/462865を参照してください。
Amir Ali Akbari

回答:


262

あなたがGNUの日付を持っていて、私があなたを正しく理解したなら

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

または

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

1
ほとんどが推奨される回答であることがわかりましたが、Solarisの日付に-dスイッチが見つかりません
conandor 2009

3
日付関数を使用したUbuntuでの使用:$(date +%Y:%m:%d -d "1 day ago")の場合、出力は2013:04:21です。そして、10日前の日付が必要な場合は、$(date +%Y:%m:%d -d "10 days ago")または$(date +%Y:%m:%d -d "10を使用できます。 1日前 ")
zhihong

OS X上では、BREWを通じてのcoreutilsをインストールすることができます参照stackoverflow.com/questions/15374752/...
kasterma

11
date -v-1dOSX(マイナス)、-v+1d(プラス)
bgs '26

2
このbash関数は、LinuxとOSXの両方で機能します。基本的に、最初にGNU Linuxスタイルを試します。それが失敗した場合は、OSXスタイルを試します。日付を知りたい過去の日数を引数として呼び出します。引数を渡さない場合、0日と見なされます。このコードは1行なので、カットアンドペーストは機能します-行末は想定されていません。date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Noah Spurrier、2016年

50

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

41
date --date='-1 day'

4
macOS Sierraのdate: illegal option -- -
Erros

2
この構文をmacOSで機能させるにdateは、coreutilsパッケージから入手できるのGNUバージョンをインストールする必要があります。Homebrewを使用している場合は、を介してインストールできます。brew install coreutilsその後、gdateコマンドでGNU日付を使用できるようになります。参照:topbug.ne​​t/blog/2013/04/14/...
sumitsu


7

まあ、これは遅い答えですが、これはうまくいくようです!!

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


4

SolarisシステムではIについて言及していません。そのため、-dateスイッチはSolaris bashでは使用できません。

タイムゾーンを少し変更するだけで前の日付を取得できることがわかりました。

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

夏時間を使用している場所に住んでいる場合、この方法は100%信頼できません(実際には約98%)。
jlliagre

正確には、使用できます bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

代わりにおそらく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


1
yesterday=`date -d "-1 day" %F`

昨日の日付をYYYY-MM-DD形式で変数に入れます$yesterday


1
#!/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

少し冗長ですが、修正のための+1、興味深い方法です。
Peter Lindqvist

1
こんにちはmedoix、$ {$#}の意味がわかりません。$#はスクリプト/関数への引数の数を表すことを知っています。しかし、私はこれに関係することができません。助けてください。
Karthick S

これは、月の変更の前日には機能しません。たとえば、今日は1 July , 2013、出力2013-6-1347結果はですが、予想される結果は2013-6-30
誤解です

"fi"の間にある3行の代わりに、 "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"を試してください
アントンロズロフ2013

1

選択した日付形式が「YYYYMM」の場合、正規表現を使用して簡単な計算を実行できます。

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

2020年1月には201912が返されます;-)ただし、これは、日付に計算オプションがなく、他の日付インタープリターオプション(たとえば、perlを使用)が利用できない場合の回避策です;-)



0

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


0

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

echoコマンドで使用される-eパラメーターはbashで必要ですが、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

0

それほどセクシーではないが、仕事をするかもしれない:

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)'

「マーティンクレイトン」の回答からフォーマット。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.