[算法] シリアル秒の求め方

2010年5月10日

アルゴリズムというほどのものではありませんが。

いわゆるUnix時間だのGMT通算秒だのと言われている2038年問題の例のカウンタですが、とある処理系でシリアル秒を求めてほしいと言ったら、そんな機能はないと却下されたので、導入は断念したのですが、作るとしたらどうなるだろうと思って作ってみました。

最適化できる余地や、言語仕様的にどうなんだろうとかいう点はありますが、メモなのでまあよいか。と。

C#

int GetEpochTimeSerial(int year, int month, int day, int hour, int minute, int second)
{
    // 1970年元旦からの指定年元旦までの閏年(閏日)の数  '/' は商を取得。少数点以下切り捨て。
    int leapDays1 = (year / 4) - (year / 100) + (year / 400);   // 西暦元年~指定年の閏日の積算
    int leapDays2 = (1970 / 4) - (1970 / 100) + (1970 / 400);   // 西暦元年~1970年の閏日の積算 = 477
    int leapDays = leapDays1 - leapDays2;                       // 1970年~指定年の閏日の積算

 // 1970年元旦から指定年元旦までの日数
    int epochDays = 365 * (year - 1970) + leapDays;             // (年*365 + 閏日の積算)

 // 各月の日数 1 2 3 4 5 6 7 8 9 10 11 12 
    int[] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

 // 指定月の前月末日までの日数 (前月までの日を積算)
    for (int i = 1; i < month; i++)
    {
        epochDays += monthDays[i - 1];
    }
 // 指定月が2月を超えていて、かつ閏年だったら 1日足す
    if (month >= 3)
    {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        {
            epochDays += 1;
        }
    }
 // 前日までの日を足す
    epochDays += (day -1);

 // 日を秒にし、本日の時分秒を足す。
    int epochSeconds = (epochDays * 86400) + (hour * 3600) + (minute * 60) + second;

 // 結果を戻す
    return epochSeconds;

}





カテゴリー: C#, Program, アルゴリズム, 情報技術

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org