うるう秒と日付

うるう秒と日付

私はUnixの時間を見つけましたうるう秒を除く。そうすれば、UTCから徐々に遠くなるので、これは非常に驚くべきことだと思います。しかし、私の質問のポイントはそれではありません。

編集(3x):簡単に言えば、詳細については以下と説明を参照してください。

システムクロックがUnix/POSIX時間(いいえdate「実際の」UTC)、Unix時代(または他のプログラムで)から経過した実際の時間(秒)をどのように知ることができますか?

それとも、少なくとも手動でダウンロードせずにうるう秒を取得できる「うるう秒」ファイルはLinuxにありますか?

私のシステムクロックがUnix時間に設定されているという結論に達した方法の説明:

次の行を読むこのリンクから次の提案リシャム:

したがって、過去のグレゴリオ暦とUTCの時間尺度に基づいて新起源を最も正確に決定するには、ユーザーは、明らかなNTPまたはPOSIXエポックから関連オフセットを減算する必要があります。IERSから提供。

date --utc +%s実際に「Unixタイムスタンプ」と呼ぶものを提供する結論に達した方法の説明:

最初のうるう秒は1972年6月30日に導入されました。

1970年1月1日(UNIX時代)00:00:00から1972年7月1日00:00:00の間には365+365+(31+29+31+30+31+30)があることを容易に計算できます。 )日+ 1うるう秒= 912日+ 1 うるう秒= 78796801秒。今すぐ試してみてくださいdate -R --utc -d @78796801...出力:1972年7月1日土曜日00:00:01!!(私が以前にやったように)Unixタイムスタンプが1970年1月1日00:00:00以降、現実世界で経過した秒数を直接提供すると思ったら...それは間違っていました!

この例は、date次の値が@実際のUnixタイムスタンプとして扱われ、POSIX時間定義に従って正しい対応する日付を提供することを示しています。しかし、同じ値を使用する方法そしてタイムスタンプではなく、エポック以降の実際の時間(秒)ということでしょうか? ...

【次の内容は読まないでください。初期の仮定が間違っていたので、「記憶」にしておきます。

date -R --utc && date -R --utc -d @$(date --utc +%s)

コマンドラインの説明:

最初は、私のコンピュータに設定されたUTC日付をUnix時代以降の秒数としてdate提供します。$(date ...)減らす(今日25)ユンチョ。dateうるう秒が正しく管理されていない場合、このUnix時間を引数として使用すると、最初のコマンドと比較して25秒前の日付を指定する必要があります。これは事実ではないので、date「うるう秒認識」は必須です。

答え1

私の問題に対する簡単な解決策が見つからなかったので、それを解決するために小さなBashスクリプトを書いています。以下のリンクに記載されているうるう秒ファイルをダウンロードしてスクリプトと一緒に配置するか、パスを変更する必要があります。まだ書いたことはありませんが、utc2unix.sh適応しやすいです。躊躇しないでコメントを提示または提案してください。

unix2utc.sh:

#!/bin/bash

# Convert a Unix timestamp to the real number of seconds
# elapsed since the epoch.

# Note: this script only manage additional leap seconds

# Download leap-seconds.list from
# https://github.com/eggert/tz/blob/master/leap-seconds.list

# Get current timestamp if nothing is given as first param
if [ -z $1 ]; then
    posix_time=$(date --utc +%s)
else
    posix_time=$1
fi

# Get the time at which leap seconds were added
seconds_list=$(grep -v "^#" leap-seconds.list | cut -f 1 -d ' ')

# Find the last leap second (see the content of leap-seconds.list)
# 2208988800 seconds between 01-01-1900 and 01-01-1970:
leap_seconds=$(echo $seconds_list | \
               awk -v posix_time="$posix_time" \
               '{for (i=NF;i>0;i--)
                   if (($i-2208988800) < posix_time) {
                    print i-1; exit
                    }
                } END {if (($(i+1)-2208988800) == posix_time) 
                    print "Warning: POSIX time ambiguity:",
                            posix_time,
                          "matches 2 values in UTC time!",
                          "The smallest value is given." | "cat 1>&2"
                }')
# echo $leap_seconds

# Add the leap seconds to the timestamp
seconds_since_epoch=$(($posix_time + $leap_seconds))

echo $seconds_since_epoch

いくつかのテスト:

  • date --utc +%s && ./unix2utc.sh->今日から2015年6月までの差は25秒です。
  • ./unix2utc.sh 78796799->78796799
  • ./unix2utc.sh 78796801->78796802
  • ./unix2utc.sh 78796800-> 78796800+標準エラーの場合:Warning: POSIX time ambiguity: 78796800 matches 2 consecutive values in UTC time! Only the smallest value is given.

関連情報