1970年1月1日からの日数を計算する


10

1970年1月1日からの日数をどのように計算できますか?これは、OpenLDAP のshadowLastChange属性を更新するためのものです。

Linuxのdateコマンドを使用してこれを行う方法はありますか?


Bashおよびほとんどの最新のBourne派生シェルで$()は、読みやすさなどの理由から、バッククォートよりも優先されます。echo $(( $(date ...) / 86400 ))
追って通知があるまで一時停止。

まだ2000を持っていない...誰かがタイトルを編集して修正できます:-)
リングØJan

回答:


20

ring0は数秒で私を倒しましたが、完全なコマンドは次のとおりです。

echo $(($(date --utc --date "$1" +%s)/86400))

これは、UTC時間です。結果:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

WolframAlphaので簡単にチェック、これは正しい値であることを示しています。


1
うるう秒はどうですか?:)
netvope 2015

1
@netvopeうるう秒がさらに経過すると、UNIX時間は1にリセットされます。したがって、毎日、正確に86400 UNIX秒が追加されます。ただし、UNIX時間915148800は、UTC 1998-12-31T23:59:60と1999-01-01T00:00:00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

dateコマンドはあなたからの秒数を与えることができます1970-01-01 00:00:00 UTC

  date +"%s"

結果3600*24を日数(UTC)で割ることができます。

例えばバッシュで

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

日数を表示します。


9

私はこれが最も簡単な方法だと思います:

expr $(date +%s) / 86400

なぜこれが反対投票されたのですか?それが最善かつ最短かつ最も単純な答えです
トムコリス

1

私もこれを解決する必要がありましたが、時間に関係なく、day#に対して同じ値を取得したいと考えました。ここに示すようなアプローチでは、値は現地時間の真夜中ではなくUTC真夜中に変化します。これはおそらく、UTCに十分近いEUまたは米国の東海岸では、通常の就業日の途中で日の値が変わらない問題ではないようですが、たとえばカリフォルニアでは、日が変わります。午後4時に発生しますが、これは不便な場合があります。オーストラリア人は、特に朝早く日の値が変わるのに悩まされると思います。

これを修正したい場合は、秒/日で割る前にUTCからのオフセットを追加する必要があります。さいわい、Linuxのdateコマンドには、UTCからのオフセットを報告する%z形式のシーケンスが含まれています。標準形式(この結果はデンバー時間、MDT用)ですが、

$ date +%z
-0600

。。。計算で直接使用することはできません、適切な修飾子は私たちが望むものをもたらします:

$ date +%-:::z
-6

これを通常の秒/時間/日変換と合わせて、次のようにすると、1970年1月1日からの日数が出力され、1/1970年自体がゼロ日となり、値が現地時間の午前0時に増分します。

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

によってdate +%-:::z生成された「+5:30」は「式に無効な文字」エラーを生成するため、この単純な計算は、UTCから1時間もオフセットされていないタイムゾーン(たとえば、インド、TZ =アジア/コルカタ)では機能しません。上記のステートメントで使用した場合。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.