web-dev-qa-db-ja.com

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

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

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

10
nitins

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

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

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

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

WolframAlphaによるクイックチェック は、これが正しい値であることを示します。

20
Dave Drager

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

expr $(date +%s) / 86400
9
DarkHorse

dateコマンドは、1970-01-01 00:00:00 UTCからの秒数を提供します。

  date +"%s"

結果を3600*24で除算すると、日数(UTC)を取得できます。

例えば。バッシュで

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

日数を表示します。

9
Ring Ø

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

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

$ date +%z
-0600

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

$ date +%-:::z
-6

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

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

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

1
oracleif