2012年8月16日木曜日

年月日時分秒からUNIXtimeに

年月日時分秒をUNIXtime(秒)に変換する関数です



 int YMDhms2s(int Y, int M, int D, int h, int m, int s) {
    int y = Y - 1970;
    int res = 0;
    while(y > 0) {
        if ((y % 4) == 0 && (y % 100) != 0 || (y % 400) == 0) {
            res += 31622400;
        } else {
            res += 31536000;
        }
        y--;
    }
   
    switch(M - 1)
    {
    case(12): { res += 2678400; }
    case(11): { res += 2592000; }
    case(10): { res += 2678400; }
    case( 9): { res += 2592000; }
    case( 8): { res += 2678400; }
    case( 7): { res += 2678400; }
    case( 6): { res += 2592000; }
    case( 5): { res += 2678400; }
    case( 4): { res += 2592000; }
    case( 3): { res += 2678400; }
    case( 2): {
        if ((Y % 4) == 0 && (Y % 100) != 0 || (Y % 400) == 0) {
            res += 2505600;
        } else {
            res += 2419200; }
              }
    case( 1): { res += 2678400; }
    default : { break; }
    }

    res += (D - 1) * 86400;

    res += h * 3600;
    res += m * 60;
    res += s;
   
    return(res);
}

まずは年を秒に変換します
めんどくさいのでwhileを使いましたが
すっげー遅くなるので本来は使うべきではない

次に月を秒に変換しますが
ここは
1. 1ヶ月の長さがまちまち
2. 2月は閏年を考慮する必要がある
という理由により
switchを使っています

そして日 時 分 秒をそれぞれ計算していきます
流れとしては非常に簡単
一応正常に動いてるっぽいので 大丈夫なはずです

なお閏年判定のコードはwikipediaから拝借しました

このコードはUNIXtimeに変換するものですが
定数の変更でNTPtimeも対応可能なはずです

前にUNIXtimeを文字列に変換する関数もおいてるので
それと組み合わせれば色々と遊べます
まぁ組み込みとかの内の一部用途でしか使い道無いんですが

一応32bitだと2100年くらいまで処理できるので
しばらくの間は大丈夫だと思います

0 件のコメント:

コメントを投稿