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