1. 概要

Linuxコマンドラインで作業したり、シェルスクリプトを記述したりする場合、必要な形式で日付を出力したり、相対的な日時を取得したり、システムの日時を変更したりするなど、日付と時刻の値を処理する必要があります。

このチュートリアルでは、 date ユーティリティを詳しく見て、その一般的な使用法を学びます。

2. dateコマンドの概要

date コマンドは、 GNU coreutils パッケージの一部であるため、すべてのLinuxディストリビューションにデフォルトでプリインストールされています。

dateコマンドを使用する構文は次のとおりです。

date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

オプションを指定しない場合、 date コマンドは、曜日、月、時刻、年、タイムゾーンを含む現在のシステムの日付と時刻を出力します。

$ date
Sat 21 Mar 2020 08:51:23 PM CET

ただし、さまざまなオプションを渡すと、dateコマンドはそれ以上のことを実行できます。

dateコマンドの一般的な使用法は次のとおりです。

    • 指定されたタイムゾーンの現在の日付と時刻を表示します
    • 日付と時刻を必要な形式で表示する
  • 指定された文字列の日付と時刻を表示します
  • 相対的な日付と時刻を取得する
  • システムの日付と時刻を設定します

これらのそれぞれを処理する方法を学ぶために、いくつかの例を見てみましょう。

3. タイムゾーンを上書きする

3.1. UTCで日付と時刻を表示する

date コマンドは、システムで定義されたタイムゾーンの日付と時刻を出力します。

UTCは特別なタイムゾーンです。 dateコマンドは、UTCで日付と時刻を表示するオプション-uをサポートしています。

$ date -u
Sat 21 Mar 2020 08:51:03 PM UTC

3.2. 別のタイムゾーンで日付と時刻を表示する

date コマンドは、デフォルトで / etc /localtimeで定義されたタイムゾーンを使用します。 / etc / localtime ファイルは通常、タイムゾーンファイルを指すシンボリックリンクです。

$ readlink /etc/localtime
/usr/share/zoneinfo/Europe/Berlin

別のタイムゾーンの日付と時刻を知りたい場合があります。 環境変数TZを設定して、日付コマンドのタイムゾーン設定を上書きできます

$ date 
Sat 21 Mar 2020 10:07:37 PM CET
$ TZ="EST" date
Sat 21 Mar 2020 04:07:42 PM EST

TZ 変数に、上記の例のESTなどのタイムゾーンの省略形、またはタイムゾーンデータベース名を割り当てることができます。

$ TZ="Asia/Tokyo" date
Sun 22 Mar 2020 06:07:55 AM JST

変更された環境変数TZは、次の日付コマンド専用であり、システムのタイムゾーンは元の値を保持します

$ date
Sat 21 Mar 2020 10:09:10 PM CET

4. 日付と時刻をさまざまな形式で表示する

4.1. サポートされている形式で日付と時刻を表示する

date コマンドは、多くの表示フォーマットオプションをサポートしています。 必要な形式をdateに渡すことができます。

date "+FORMATS"

日付形式を変更するいくつかの例を見てみましょう。

$ date '+Current Date: %F%nCurrent Time: %H:%M:%S'      
Current Date: 2020-03-21
Current Time: 22:23:03

$ date '+Today is %A, the %wth day in the week %W.%nUnix timestamp for now: %s'  
Today is Saturday, the 6th day in the week 11.
Unix timestamp for now: 1584826306

一般的に使用される形式は次のとおりです。

  • %A –ロケールの完全な平日の名前(たとえば、日曜日
  • %D –日付; %m / %d /%yと同じ
  • %F –完全な日付。 %+4Y-%m-%dのように
  • %s 1970-01-01 00:00:00UTCからの秒数
  • %y –年の最後の2桁( 00..99
  • %Y –年(たとえば、2020)
  • %Z –アルファベットのタイムゾーンの省略形(たとえば、 EST
  • %N –ナノ秒

サポートされているフォーマットシーケンスの完全なリストは、manページまたは date –help。の出力にあります。

4.2. 日付と時刻をミリ秒単位で表示する

デフォルトでは、 date コマンドは、ミリ秒単位での日付と時刻の表示をサポートしていません。 ただし、 date コマンドは、ナノ秒形式%Nをサポートします。 たとえば、現在の時刻のナノ秒を取得できます。

$ date +"%N"
696644200

ナノ秒を最初の3桁に丸めると、ミリ秒になります

$ date +"%3N"  
658

“%3N” 形式を他の形式と組み合わせて、日付と時刻をミリ秒単位で表示できます。

1970-01-01 00:00:00 UTC:からのミリ秒を取得しましょう

$ date +"%s%3N"
1601496351755

現在の日付と時刻をミリ秒で表示することもできます。

$  date +"%F %T.%3N"
2020-09-30 22:07:30.450

5. 指定された文字列からの日付の表示

静的な日付または時刻の文字列値を-dオプションと一緒にdateコマンドに渡して、必要な形式で日付と時刻を解析および印刷することができます。

たとえば、1976年11月18日18:18:18を示す日付文字列をdateコマンドにいくつかの方法で渡すことができます。

$ date -d'1976-11-18 18:18:18' 
Thu 18 Nov 1976 06:18:18 PM CET

$ date -d'11/18/1976 18:18:18' 
Thu 18 Nov 1976 06:18:18 PM CET

$ date -d'18 Nov 1976 18:18:18' 
Thu 18 Nov 1976 06:18:18 PM CET

$ date -d'19761118T18:18:18' 
Thu 18 Nov 1976 06:18:18 PM CET

$ date -d'@217185498'
Thu 18 Nov 1976 06:18:18 PM CET

上記の例から、次のことがわかります。 dateコマンドでサポートされる日付文字列パターンは非常に柔軟です。 次のUnixタイムスタンプにすることができます @ 、ISO日付形式、または人間が読める形式の日付文字列です。

6. 相対的な日付と時刻を取得する

前のセクションでは、-dオプションの日付文字列がいかに柔軟であるかを見てきました。 このセクションでは、引き続き -d’dateString’ を使用して、dateコマンドに過去または将来の相対的な日付と時刻を計算させます。

このセクションでは、相対的な日付計算のすべての例は、現在の日付と時刻に基づいています。

$ date
Sun 22 Mar 2020 11:27:41 PM CET

6.1. 昨日明日

現在の日付の前後の1日を取得することから始めましょう。 非常に簡単です。昨日明日-dオプションで渡すだけです。

$ date -d'yesterday'
Sat 21 Mar 2020 11:30:32 PM CET

$ date -d'tomorrow' 
Mon 23 Mar 2020 11:30:37 PM CET

6.2. next、 ago last

-d オプションを指定して昨日または明日を渡すと、基準日の前後の1日を取得するのに役立ちます。

しかし、前後の任意の日数を取得したい場合はどうなりますか? または、週、月、年などの他の単位でも?

next ago、、および last 式は、次の場合に役立ちます。

$ date -d'3 days ago'
Thu 19 Mar 2020 11:40:14 PM CET

$ date -d'next 2 month'
Thu 23 May 2020 12:40:23 AM CET

$ date -d'last week' 
Sun 15 Mar 2020 11:40:29 PM CET

$ date -d'next wed' 
Wed 25 Mar 2020 12:00:00 AM CET

$ date -d'last Sunday'
Sun 15 Mar 2020 12:00:00 AM CET

6.3. +xおよび-x

nextlastなどの人間が読める形式の日付文字列に加えて、-dオプションに単位付きの数値を渡すこともできます。正の数数値は将来の日時を取得しますが、負の数値は過去の日時を示します。

$ date -d'+7 day'   
Mon 30 Mar 2020 12:54:43 AM CET

$ date -d'-3 year'   
Wed 22 Mar 2017 11:54:51 PM CET

$ date -d'10 week'   
Mon 01 Jun 2020 12:55:08 AM CET

このようにして、たとえばシェルスクリプトで、プログラムによって相対的な日時を簡単に計算できます。

6.4. 特定の日付に基づいて相対的な日付と時刻を取得する

これまで、現在の日時に基づいて相対的な日時を取得する例をいくつか見てきました。 特定の日付文字列でも機能します。

1976-11-18に基づいて相対的な日時を取得するいくつかの例を見てみましょう。

$ date -d'19761118 -3 days'
Mon 15 Nov 1976 12:00:00 AM CET

$ date -d'19761118 last year'     
Tue 18 Nov 1975 12:00:00 AM CET

$ date -d'19761118 tomorrow' 
Fri 19 Nov 1976 12:00:00 AM CET

$ date -d'19761118 2 month ago' 
Sat 18 Sep 1976 12:00:00 AM CET

7. システム時刻を変更する

dateコマンドを-sオプションとともに使用して、システムクロックを手動で変更できます。 システム時刻を変更すると現在実行中のプログラムに影響するため、rootユーザーのみがその変更を行うことができます。[X01X]

たとえば、次のコマンドはシステム時刻を 1976-11-1818:18:18に設定します。

root# date -s "1976-11-18 18:18:18"

8. 結論

date コマンドは、日付と時刻の値を処理するための非常に便利なユーティリティです。

この記事では、その一般的な実用的な使用法に焦点を当てて調査しました。