シェルスクリプトでのYYYY-MM-DD形式の日付


1112

$(date)bashシェルスクリプトで使用してみましたが、日付のYYYY-MM-DD形式が必要です。
どうすれば入手できますか?

回答:


1832

bash(> = 4.2)では、外部date(通常はGNU日付)ではなく、printfの組み込み日付フォーマッター(bashの一部)を使用することをお勧めします。

など:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

bashの場合(<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

他の使用可能な日付形式は、日付のmanページから表示できます(bash固有でない外部コマンドの場合)。

man date

4
その月の最初の日に私は "2012-07-1"を取得しますが、これはOPが要求するものではありません。
DerMike

6
これでうまくいきます。マンページは、月の最初が01、1でないことを示唆しています(例:2012-07-01)。
Bob Kuhar 2013年

31
DATE = $(date +%d-%m-%Y ""%H:%M:%S); 私が結局何をしたか。
JacopKane 2015年

5
これらのショートカットがどれだけ広く利用できるかは確認していませんが、一部のディストリビューションで+%F %Tはのショートカットとして使用できます+%Y-%m-%d %H:%M:%S。ことだけメモいくつかのファイルシステム(咳** HFS)が変換されます:/あなたのような文字列を与えて、2016-09-15 11/05/00強大な混乱されているが。
ベポーター2016

24
この千年紀のPOSIX準拠シェルで推奨される構文は、ではdate=$(date)なくですdate=`date`。また、プライベート変数には大文字を使用しないでください。大文字の変数名はシステム用に予約されています。
tripleee 2016

335

試してください: $(date +%F)


12
日付のマニュアルページは次のとおりです。%F完全な日付。%Y-%m-%dと同じなので、これは受け入れられた回答のよりコンパクトな表記です。
HåvardGeithus

92

あなたはこのようなことをすることができます:

$ date +'%Y-%m-%d'

47

ISO 8601標準の日付形式を探しているので、GNU日付(または1988よりも新しい日付コマンド)がある場合は、次のようにします。$(date -I)


9
最近(> 1988)のMac OS Xコンピュータを使用してdate -Iいますが、動作しませんでした。インストールされたGNUのcoreutilsのを使用して醸造(接頭辞「G」を使用しています)gdate -Iの仕事をしてくれました。
Joel Purra 2013

3
奇数。-IGNU用に文書化されたオプションは見つかりませんが、date確かにと同等のようdate +%Fです。
chepner 2013年

3
OS Xは一般にGPL v3の荒地なので、日付やBASHが最近更新されていない可能性があります。
2013

20
date -d '1 hour ago' '+%Y-%m-%d'

出力はになります2015-06-14


3
いくつかの理由で間違っていますが、これは明らかに00:00から01:00の間に間違った日付を与え、さらにあなたは%
Gerhard Burger

それは真実ではない。このまばらな単一引用符のようになるはずです
BeyhanGül'27


19

最近のBash(バージョン≥4.2)では、組み込みprintfのformat修飾子を使用できます%(strftime_format)T

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfは外部コマンドでありdateながらBashビルトインであるため、より高速ですdate

同様に、サブシェルをforkする必要がないのでprintf -v date ...より高速ですdate=$(printf ...)


4
2019年の注記として、このコマンドはdate、余分なライブラリをロードする必要がないため、すでにbashスクリプト内から使用している場合よりも非常に高速です* 。(*私のLinuxサーバーでは、1000回の反復で約160倍の速度差を測定しました)
timtj

@timtj指摘してくれてありがとう!速度に関するメモを回答に追加しました。
wjandrea

1
printf -v dateサブシェルをフォークしないことについてのコメントに+5ができたらいいのにと思います。とても良い情報!!
timtj

一部の日付をインクリメントする必要があるため、通常は日付を使用します。printfは日付計算を実行できますか?
マーリン

1
@マーリン私はそうは思いません
wjandrea

8

私がこのような仕事をするときはいつでも、

$ man strftime

すべての可能性を思い出します。


7

年を2017ではなく17などの2つの数値形式で表示する場合は、次のようにします。

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

ここで、xは使用されたサンプルの日付です。例では、データのフォーマットと現在の日付より10分多い日付の取得の両方が表示されます。


6

次の公式を使用します。

TODAY=`date -I`
echo $TODAY

のmanページを確認してください。date他にもいくつかの便利なオプションがあります。

man date

5

私が使用し$(date +"%Y-%m-%d") たり$(date +"%Y-%m-%d %T")、時間と時間を持ちます。


1

あなたは環境変数として日付を設定でき、後でそれを使用できます

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

または

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.