回答:
ring0は数秒で私を倒しましたが、完全なコマンドは次のとおりです。
echo $(($(date --utc --date "$1" +%s)/86400))
これは、UTC時間です。結果:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
WolframAlphaので簡単にチェック、これは正しい値であることを示しています。
私もこれを解決する必要がありましたが、時間に関係なく、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 =アジア/コルカタ)では機能しません。上記のステートメントで使用した場合。
$()
は、読みやすさなどの理由から、バッククォートよりも優先されます。echo $(( $(date ...) / 86400 ))