開始日の経過時間(秒)を日付に変換

開始日の経過時間(秒)を日付に変換

特定の秒を日付に変換したいです。私の場合は、0001年1月1日以降に経過した秒数です。

エポックから数秒が経過したら簡単です$ date -r nr_of_secondsdate特定の日に開始するように指示する方法があれば良いと思います。そのようなオプションはありますか(-v私の要件をほぼ満たしているようです...私の考えでは)?

私はMacを使用しています。

答え1

date -r作業はほぼ完了しました。あなたがすべきことは、原点を移動することだけです。これは加算的です。

date -r $((number_of_seconds - epoch))

epoch1970年1月1日から1970年1月1日の間の秒数はどこにありますか?値はepochカレンダーによって異なります。

グレゴリー力では1年から1970年までに477回のうるう年があるので、365×1969+477=719162日=62135596800秒となります。この数は2 32より大きいため、これを処理するには64ビット操作可能なシェルが必要です。それが西暦2世紀以降の日付を表す場合、とにかくあなたは232number_of_seconds歳以上です。私の考えでは、bashは以前の32ビットOSXでも64ビット算術をサポートすると思いますが、わかりません。

date -r $((number_of_seconds - 62135596800))

答え2

以下を使用できます。

echo $(( `date +%s` - ` date --date=yesterday +%s ` ))
86400

「昨日」を希望の日付に変更できます。たとえば、

echo $(( `date +%s` - ` date --date='Tue Aug 9 11:44:34 CEST 2014' +%s ` ))
259209

GNU/Linux でテスト済みです。

答え3

問題は、誰もが1923年以前の日付に同意するわけではないということです。私たち(西欧人)は今グレゴリオ暦を使います。 1582年以前は、人々はユリウスの力を使いました。一部の人々は1582年から1923年の間にこれらの1つを使用しました。

たとえば、イギリスは1752年にグレゴリオ暦に切り替えましたが、これがcalこのコマンドで使用される移行点です。出力を表示しますcal 9 1752

したがって、1654年11月3日を参照する古い英語文書を探している場合、その日付は1654年11月3日を参照するフランス語文書と必ずしも同じではありません。当時、フランスとイギリスはどちらも、0001-01-01が何の日付であるか(つまり、その日に何が起こったのか)に同意しましたが、GNUがdate日付と見なした日付ではありませんでした。

私は同じカレンダースイッチを使用し、calうるう秒を無視してランダムな日付計算を実行するいくつかのPOSIXシェル関数を書いたことがあります。以下で見つけることができます:https://github.com/stephane-chazelas/misc-scripts/blob/master/wide_strftime.sh

たとえば、0001-01-01 00:00:00 GMTユリウス力の後に10G秒の日付を知りたい場合(1日あたり86400秒を想定しているため、すべての秒が同じ時間持続するわけではありません):

$ timegm 1 1 1 0 0 0
$ wide_strftime "%c" "$((REPLY + 10000000000))"
echo "$REPLY"
$ echo "$REPLY"
Mon Nov 18 17:46:40 0317

関連情報