Dateutils は、大量の財務データを扱うときに発生するユースケースに重点を置き、コマンド ラインで日付と時刻を操作することを中心とした一連のツールです。
Dateutils は主に github でホストされています。
github ページ: https://github.com/hroptatyr/dateutils
プロジェクトのホームページ: http://www.fresse.org/dateutils/
ダウンロード: https://bitbucket.org/hroptatyr/dateutils/downloads
以下は、dateutils で何ができるかを示す例の短いリストです。完全な仕様については、情報ページとマニュアルページを参照してください。 インストール手順については、INSTALL ファイルを参照してください。
Dateutils コマンドにはプレフィックスとしてdate
が付いていますが、それ以外は直感的な理由から既知の UNIX コマンドに似ています。 唯一の例外は、同じ名前の libc 関数に似ているstrptime
です。
strptime
C 関数のコマンド ライン バージョン
dateadd
日付または時刻に期間を追加します
dateconv
カレンダー間で日付または時刻を変換します
datediff
日付または時刻間の期間を計算します
dategrep
入力ストリーム内の日付または時刻を Grep します。
dateround
日付または時刻を「より完全な」値に丸めます
dateseq
日付または時刻のシーケンスを生成します。
datesort
時系列に並べ替えます。
datetest
日付または時刻を比較する
datezone
日付/時刻をタイムゾーンに一括変換します
第一印象を得るために、すべてを例を挙げて説明するのが大好きです。それで、来ました。
seq(1) を模倣したツールですが、その入力は整数ではなく日付のドメインからのものです。 通常、スクリプトは次のようなものを使用します
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
これは次のように短縮できます
$ dateseq 2010-01-01 2010-01-10
さらに、開始日と日数の間隔から終了日を計算する代わりに、終了日を直接指定できるという利点もあります。 また、特定の平日をスキップするなど、上記の seq(1)/date(1) アプローチを使用して実装する PITA となる日付固有の機能も提供します。
$ dateseq 2010-01-01 2010-01-10 --skip sat,sun => 2010-01-01 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08
dateseq は時間に対しても機能します。
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
日時も:
$ dateseq --compute-from-last 2012-01-02T12:00:00 5m 2012-01-02T12:17:00 => 2012-01-02T12:02:00 2012-01-02T12:07:00 2012-01-02T12:12:00 2012-01-02T12:17:00
異なる暦法やタイムゾーンの間で日付を変換するツール。 他のこのようなツールは通常、グレゴリオ暦の日付を中国暦などに変換することに重点を置いていますが、dconv は金融の文脈で不可欠な暦システムをサポートすることを目的としています。
(グレゴリオ暦) 日付をいわゆる ymcw 表現に変換するには、次のようにします。
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
逆も同様です:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
ここで、ymcw 表現は、指定された年の月の%c
-th %w
意味します。 これは、たとえば 5 月の第 3 木曜日のように日付が指定されている場合に便利です。
dateconv は、入力ストリーム内の日付、時刻、または日時の出現をオンザフライで変換するために使用することもできます。
$ dateconv -S -i '%b/%d %Y at %I:%M %P' <<EOF Remember we meet on Mar/03 2012 at 02:30 pm EOF => Remember we meet on 2012-03-03T14:30:00
そして最も顕著なのは、タイムゾーン間の変換です。
$ dateconv --from-zone "America/Chicago" --zone "Asia/Tokyo" 2012-01-04T09:33:00 => 2012-01-05T00:33:00 $ dateconv --zone "America/Chicago" now -f "%d %b %Y %T" => 05 Apr 2012 11:11:57
シェルで日付比較を実行するツールtest(1)
をモデルにしていますが、適切なコマンド ライン オプションが付いています。
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
シェル内で日付演算(日付計算)を行うツール。 日付と期間のリストを指定すると、新しい日付が計算されます。 期間と日付のリストを指定すると、新しい日付が計算されます。
$ dateadd 2010-02-02 +4d => 2010-02-06 $ dateadd 2010-02-02 +1w => 2010-02-09 $ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF => 2001-01-04 2000-12-31
時間に期間を追加する:
$ dateadd 12:05:00 +10m => 12:15:00
そして日時さえも:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
システムのzoneinfoデータベースでサポートされている場合、うるう秒を調整した計算が可能です。 「実際の」秒を表すには、単位rs
を使用します。
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
対照的に:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
2 つ (またはそれ以上) の日付の差を計算するツール。 これはお父さんの逆です。 出力は、最初の日付に追加されると 2 番目の日付となる期間になります。
2 つの日付の間の日数を取得します。
$ datediff 2001-02-08 2001-03-02 => 22
期間の形式は、 -f
スイッチを使用して制御できます。
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
datediff はタイムスタンプも入力として受け入れます。
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
-f
スイッチは正しい動作を行います。
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
と比較してください:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
システムのzoneinfoデータベースでサポートされている場合は、うるう秒を調整した計算を行うことができます。 形式指定子%rS
を使用して、経過時間を「実際の」秒単位で取得します。
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
入力ストリームから特定の基準に一致する行を抽出し、行または一致のいずれかを表示するツール。
$ dategrep '<2012-03-01' <<EOF Feb 2012-02-28 Feb 2012-02-29 leap day Mar 2012-03-01 Mar 2012-03-02 EOF => Feb 2012-02-28 Feb 2012-02-29 leap day
日付やタイムスタンプを、次/前の 1 月や次/前の木曜日など、定期的な時点に「丸める」ツール。
現在の月の最初の日に丸めます (逆方向に):
$ dateround '2011-08-22' -1 => 2011-08-01
現在の日付から次の月曜日を検索します (今日は 2016-01-08)。
$ dateround today Mon => 2015-01-11
昨年の 9 月に戻り、月末に丸めます。
$ dateround today -- -Sep +31d => 2015-09-30
日付のストリームを厳密に次の月の最初に丸めます。
$ dateround -S -n 1 <<EOF pay cable 2012-02-28 pay gas 2012-02-29 pay rent 2012-03-01 redeem loan 2012-03-02 EOF => pay cable 2012-03-01 pay gas 2012-03-01 pay rent 2012-04-01 redeem loan 2012-04-01
timeseries を次の分 (つまり、秒の部分が 00) に丸めてから、次の半時間に丸めます (そして ISO に変換します)。
$ dateround -S 0s30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:30:00 eventB
あるいは、1 日を 30 分に分割する場合は、共通クラス表記を使用していずれかの時間に四捨五入することができます。
$ dateround -S /30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:00:00 eventB
これは前の例とほぼ同じですが、まるまる 1 時間 (30 分の偶数倍) が丸め対象となる可能性がある点が異なります。
ファイルの行を時系列順に並べるツール。
現時点では、 datesort
ツールはフィールドのサポートを備えたsort(1)
に依存しています。特に-t
で区切り文字を選択し、 -k
で特定のフィールドで並べ替えます。
$ datesort <<EOF 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" EOF => 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53"
さまざまなタイムゾーンの日付/時刻値を迅速に検査するツール。結果は、すべてのタイムゾーンのすべての日付/時刻値を示す行列になります。
$ datezone Europe/Berlin Australia/Sydney now 2014-06-30T05:00:00 => 2014-01-30T17:37:13+01:00 Europe/Berlin 2014-01-31T03:37:13+11:00 Australia/Sydney 2014-06-30T07:00:00+02:00 Europe/Berlin 2014-06-30T15:00:00+10:00 Australia/Sydney
datezone
ツールを使用して、特定の日付/時刻を基準とした次または前の DST 移行を取得することもできます。
$ datezone --next Europe/Berlin Australia/Sydney 2013-02-19 => 2013-03-31T02:00:00+01:00 -> 2013-03-31T03:00:00+02:00 Europe/Berlin 2013-04-07T03:00:00+11:00 -> 2013-04-07T02:00:00+10:00 Australia/Sydney
ここで、左側のタイムスタンプは現在のゾーン オフセットを示し、右側は移行後のゾーン オフセットを示します。 日付/時刻は、移行が行われようとしている正確な瞬間を示します。
本質的には、 datezone
zdump(8)
よりも優れています。
strptime(3)
の柔軟性をコマンドラインにもたらすツール。 (少なくとも GNU) date(1)
は出力形式をサポートしていますが、特に入力形式が事前に明確にわかっていて、一致する日付/時刻のみが読み込まれる場合には、日付のドメインから任意の入力を読み取るためのサポートがありません。考慮された。
strptime
ツールがMon, May-01/2000
のような奇妙な日付を読み取ると、
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
C で行うのと同じように。
strptime
実際にはシステム libc の strptime ルーチンを使用し、出力にはシステムの strftime ルーチンを使用することに注意してください。 したがって、入力および出力修飾子はシステムによって異なります。
移植可能なパーサーとプリンターの組み合わせの場合は、上で説明したようにdateconv
を使用します。 その入力および出力形式指定子は、C ランタイムから独立しています。
順不同で、完全性を主張するものではありません。
dateexpr: http://www.eskimo.com/~scs/src/#dateexpr
allanfalloon の dateutils: https://github.com/alanfalloon/dateutils
はい http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
目的に応じて最適なものを使用してください。 そして、もしあなたが私のものを気に入った場合は、dateutils の openhub ページに投票してください。