アルゴリズムというほどのものではありませんが。
いわゆる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; }