GNUツールを使用して結果の日付ではなく日付期間を計算してフォーマットするにはどうすればよいですか?

GNUツールを使用して結果の日付ではなく日付期間を計算してフォーマットするにはどうすればよいですか?

これまでに私が見つけた数多くの記事は、結果の日付を取得することに焦点を当てたようです。これはまだ便利ですが、この場合は私が望むものではありません。

リンク例:Unix & Linux SE - 日付差をすばやく計算

他のQ&Aでは、datediffこれは私が参照したい日付/時間期間の結果に近いです。これはデフォルトで以前の変換でUnixタイムスタンプ数学を使用しますが、粒度を秒単位で下げたいと思います。これがすぐに分かれない理由です。 86400。

利用可能な期間(秒)を使用して、GNUコマンドを使用するのと同じようにフォーマットしたいと思いますdatedate -d "@69600" "+ %Y years %m months %e days %H:%M:%S"

私はすべてが本質的にUnix epochの日付/時間期間であることを知っていますが、今私が経験している問題は、日、月、年の数字がゼロから始まらず、私が望む期間値を正しく表していないことです。

この形式を切り取り、より多くのexprコマンドを適用して各値から1または1970を引くことができますが、期間の結果を得るために数学をリンクしてステップを一緒に書式設定することに加えて、日付/時刻計算を処理するより簡単な方法があるかどうか疑問に思いますします。おそらく、date私が利用できるGNUの他のオプション、または2つの日付/時刻パラメータを許可し、私が望む結果をすぐに提供できる他のツールがあるかもしれません。

Mac用Homebrewと一緒に使うと本当にいいと思います:)

簡単な日付数学リンク:Walker News - Linuxシェルスクリプトの日付算術

ランダム日付フォーマットリンク:

ベストアンサー1

そして日付ツール~のdatediff(申し訳ありませんが、GNUではありません)、(以前はddiffDebiandateutils.ddiffで):

$ dateutils.ddiff -f '%Y years, %m months, %d days, %H:%0M:%0S' \
    '2012-01-23 15:23:01' '2017-06-01 09:24:00'
5 years, 4 months, 8 days, 18:00:59

(日付はUTCで、--from-zone=Europe/London適切なタイムゾーンの現地時間に似た日付を追加します。--from-zone=localtimeシステムのデフォルトのタイムゾーンで機能できます。IANAタイムゾーンファイルへのパスを指定する--from-zone="${TZ#:}"だけです(たとえば、POSIXスタイルのTZ仕様ではありません)。 )).$TZTZ=:Europe/LondonTZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00

そして全開dateだから、まだGNUツールを使用していません。申し訳ありません(ksh93シェルとして使用すると組み込みdateツールとして機能します)。date -E単位を含む2つの数字を提供する形式を使用して、2つの日付間の違いを得ることができます。

$ date -E 1970-01-01 2017-06-01
47Y04M
$ date -E 2017-01-01 2017-06-01
4M29d
$ date -E 12:12:01 23:01:43
10h49m

上記のいずれかに注意してください時間DST(23、24、25)が適用される地域では、1日の時間数が異なり、月と年の日数も異なるため、あいまいなのであまり意味がない場合があります。上記の2つのユニットよりも正確です。

たとえば、2015-01-01 00:00:00 と 2016-01-01 00:00:00 または 2016-01-01 00:00:00 と 2017-01-01 00 の間には正確に 1 年があります。 00:00しかし、これは同じ期間ではありません(ある場合は365 * 24時間、別の場合は366 * 24時間)。

2017-03-24 12:00:00 と 2017-03-25 12:00:00 または 2017-03-25 12:00:00 と 2017-03-26 12:00:00 の間にまさに一日があります.ただし、欧州諸国の現地時間(2017年3月26日に夏時間に切り替えられる)の場合ある日場合によっては24時間、他の場合は23時間です。

つまり、年、月、週、または日の期間への参照は、適用する境界(およびタイムゾーン)の1つにのみ意味があります。したがって、適用する時間(開始または終了)がわからない場合は、日(24時間)、月(30 * 24時間)、または年を使用しない限り、秒をその期間に変換することはできません。 (365*24時間))。

秒単位の持続時間さえある程度はあいまいです。簡略化のために、Unix epoch時間の1秒は、指定された地球の1日の86400番目の部分として定義されます。地球の自転が遅くなるほど、この秒はますます長くなります。

したがって、(GNUを使用)次のようになりますdate

d1='2016-01-01 00:00:00' d2='2017-01-01 00:00:00'
eval "$(date -d "@$(($(date -d "$d2" +%s) - $(date -d "$d1" +%s)))" +'
  delta="$((%-Y - 1970)) years, $((%-m - 1)) months, $((%-d - 1)) days, %T"')"
echo "$delta"

またはfish:

date -d@(expr (date -d $d2 +%s) - (date -d $d1 +%s)) +'%Y %-m %-d %T' | \
  awk '{printf "%s years, %s months, %s days, %s\n", $1-1970, $2-1, $3-1, $4, $5}'

時間増分は、実際の開始日である2016年ではなく1970年に適用されるため、通常は正しい情報を提供しません。

たとえば、上記は(ヨーロッパ/ロンドンタイムゾーン)次のとおりです。

1 years, 0 months, 1 days, 01:00:00

変える

1 years, 0 months, 0 days, 00:00:00

(これはまだあなたに十分な近似値かもしれません)。


1技術的には、1 日は 86400 Unix 秒ですが、ネットワークに接続されたシステムは通常 SI 秒を使用して時計を原子時計と同期させます。原子時計が 12:00:00.00 を表示すると、対応する Unix システムも 12:00:00.00 を表示します。唯一の例外は、うるう秒が導入される場合です。ここで、Unix 秒は 2 秒間持続するか、数秒がより長く持続し、追加の秒がより長い期間にわたって分散されます。

したがって、2つのUnixタイムスタンプ(原子時計と同期されたシステムによって公開)の間の正確な期間(原子秒)がわかります。 2つのタイムスタンプ間のUnixエポック時間差を取得し、秒間のホッピング数を追加します。

datediff-f %rS数量もあります。本物2つの日付間の秒数:

$ dateutils.ddiff -f %S '1990-01-01 00:00:00' '2010-01-01 00:00:00'
631152000
$dateutils.ddiff -f %rS '1990-01-01 00:00:00' '2010-01-01 00:00:00'
631152009

違いは、1990年と2010年の間にうるう秒が9つ追加されたことです。

さて、この金額は本物日数は一定量ではないため、秒は日数を計算するのに役立ちません。本物第二。これら2つの日付の間には正確に20年があり、9つのうるう秒でこの値に達することはできません。また、他の書式指定子と組み合わせていない場合にのみ有効ですddiff%rSまた、将来のうるう秒はあらかじめ分かっておらず、最近のうるう秒情報は不明かもしれません。たとえば、私のシステムは2012-07-01以降は何も知りません。

おすすめ記事