今月末(2015年6月)にうるう秒が追加されることを知りました。私は自分の時間のクラスを管理しているので、それについて少し恐れています. 十分に頑丈かどうかはわかりません。
atからのミリ秒数でInstant
あるunsigned long long int
メンバー変数を操作するクラスを作成しました。ms
01/01/1600
0:00:00
現在の時刻を取得したいときは、次の関数を呼び出します。
void Instant::setCurrentTime()
{
struct timeval tv;
gettimeofday(&tv, NULL);
this->ms = NBR_DAYS_TO_EPOCH; // 135140
this->ms *= NBR_SECONDS_IN_DAY; // 86400
this->ms += tv.tv_sec;
this->ms *= NBR_MILLISECONDS_IN_SECOND; // 1000
this->ms += tv.tv_usec/1000;
}
私の最初の質問は、うるう秒がこの数値にどのように影響するかです。値にすでに考慮されていtv.tv_sec
ますか? どのように ?
2 番目の質問は、人間が読める形式への変換についてです。私の関数は非常に大きいため、ここには投稿しません (必要に応じて投稿できます) が、アイデアは次のとおりです。
- 最初に現在の日の秒数を計算し、次に分数と時間数を計算します。
- 今日から何日か前の日数を計算します。
- 次に、400 年のサイクル数 (周期プロセス)、現在の 400 年のサイクルにおける 100 年のサイクル数、および現在の 4 年のサイクルにおける 4 年のサイクル数を計算します。
- そこから、年 (うるうかどうか)、月、日、曜日を推測します。
- 次に、サマータイムが有効になっているかどうかを確認し、ゾーンに従って値を更新します (ヨーロッパ、2007 年以前の米国、2007 年以降の米国)。
- 1970 年から追加された 25 うるう秒を考慮に入れていません。
秒数が に制限されているため、今のところ、私のクラスは「ここにいます」と言うことができませ30/06/2015
ん。しかし、それを管理する方法がわからないためでもあります。良い方法は何ですか?23:59:60
59