おれさまラボ

実際に手を動かして理解を深めるブログ。

dateコマンドの使い方

はじめに

GNU dateコマンドに再入門したのでメモとして残しておきます。

検証環境

Ubuntu 18.04.4 LTSで動作確認しています。

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

基本

date は日付を返すコマンドです。

$ date
Sat Nov 13 10:08:42 JST 2020

+ 以降にフォーマット文字列を指定することで日時を整形できます。

$ date '+%Y-%m-%d'
2020-11-13

時刻を得るには %H:%M:%S で整形します。

$ date +"%Y-%m-%d %H:%M:%S"
2020-11-13 10:08:42

過去の日付を得る

1日前の日付を得る

--date '1 day ago' で1日前の日付を得ることができます。

$ date '+%Y-%m-%d' --date '1 day ago'
2020-11-12

--yesterday でも同様の結果が得られます。

$ date '+%Y-%m-%d' --date 'yesterday'
2020-11-13

1週間前の日付を得る

$ date '+%Y-%m-%d' --date '1 week ago'
2020-11-06

1か月前の日付を得る

$ date '+%Y-%m-%d' --date '1 month ago'
2020-10-13

1年前の日付を得る

$ date '+%Y-%m-%d' --date '1 year ago'                   
2019-11-13

任意の日数前の日付を得る

now のあとに任意の日数を減算することで任意の日数前の日付を得られます。

$ date '+%Y-%m-%d' --date 'now - 3 days'                             
2020-11-10

weeks も使えます。

$ date '+%Y-%m-%d' --date 'now - 3 weeks'
2020-10-23

years も使えます。

$ $ date '+%Y-%m-%d' --date 'now - 3 years'
2017-11-13

now を任意の日付とすることもできます。

$ date '+%Y-%m-%d' --date '1970-1-1 - 3 years'
1967-01-01

加算する日数は複数指定できます。

$ date '+%Y-%m-%d' --date '1970-1-1 - 3 years 3 month 3 days'
1967-04-03

未来の日付を得る

1日後の日付を得る

$ date '+%Y-%m-%d' --date 'tomorrow'
2020-11-15

1週間後の日付を得る

$ date '+%Y-%m-%d' --date '1 week'
2020-11-20

1か月後の日付を得る

$ date '+%Y-%m-%d' --date '1 month'
2020-12-13

1年後の日付を得る

$ date '+%Y-%m-%d' --date '1 year'
2021-11-13

任意の日数後の日付を得る

now のあとに任意の日数を加算することで任意の日数後の日付を得られます。

$ date '+%Y-%m-%d' --date 'now + 3 days'                             
2020-11-13

weeks も使えます。

$ date '+%Y-%m-%d' --date 'now + 3 weeks'
2020-12-04

years も使えます。

$ date '+%Y-%m-%d' --date 'now + 3 years'
2023-11-13

now を任意の日付とすることもできます。

$ date '+%Y-%m-%d' --date '1970-1-1 + 3 years'
1973-01-01

加算する日数は複数指定できます。

$ date '+%Y-%m-%d' --date '1970-1-1 + 3 years 3 month 3 days'
1973-04-04

任意の日付を得る

月初の日付を得る

date '+%Y-%m-01' --date '1 month'
2020-12-01

月末の日付を得る

月末を取得したい月の次月1日の前日を計算すればOKです。

date '+%Y-%m-%d' --date "1 day ago $(date '+%Y-%m-01' --date '2020-03-01')"

先月末の日付を取得する場合は以下ワンライナーを使用できます。

$ date --date="$(date +"%d") days ago" +"%Y-%m-%d"
2020-10-31

日付の差を得る

expr コマンドによる実現

date コマンドのみでは実現できないので expr コマンドを使って計算します。簡易なシェルスクリプトを用意すればOK。下記例では +"%s"UNIX秒に変換した上で差分を計算しています。

#!/bin/bash
date1=$(date --date $1 +"%s")
date2=$(date --date $2 +"%s")

function calc_date() {
        expr \( $date2 - $date1 \) / 60 / 60 / 24
}

function show_usage() {
        echo "Usage: basename $0 <start-date> <end-date>"
        exit 1
}

if [ $# -ne 2 ]; then
        show_usage
fi

calc_date

実行すると日付の差分が表示されます。

$ chmod +x ./diffdate.sh
$ ./diffdate.sh 2020-1-1 2020-11-13
317

today のような date コマンドで解釈できる自然言語も使用できます。

$ ./diffdate.sh 2020-1-1 today
317

datediff コマンドによる実現

dateutils には datediff コマンドが含まれており、簡単に日付の差分を計算できます。dateutils をインストール可能な環境ではこちらがオススメ。

dateutils のプロジェクトページはコチラ

以下、インストール手順です(出力は省略)。

$ sudo apt install autoconf libtool-bin make
$ wget https://bitbucket.org/hroptatyr/dateutils/downloads/dateutils-0.4.7.tar.xz
$ tar Jxfv dateutils-0.4.7.tar.xz 
$ cd dateutils-0.4.7/
$ autoreconf -i
$ ./configure
$ sudo make install

インストールが完了したことは以下コマンドで確認できます。

$ whereis datediff
datediff: /usr/local/bin/datediff
$ datediff --version
datediff 0.4.7

引数に差分を計算したい日付を入れて実行すれば差分の日数が表示されます。

$ datediff 2020-1-1 2020-11-13
317

datediff コマンドでも、date コマンドで解釈可能な自然言語を使用できます。

$ datediff 2020-1-1 today
317

以上