head-img Sihan's Blog

Tomohiko Sakamoto 算法,来确定当前日期是星期几

PHP

Tomohiko Sakamoto 算法是一种计算机程序,用于确定两个日期之间的天数差。该算法基于简单的数学计算,不依赖任何外部库和系统函数,因此它可以用于那些不支持外部库和系统函数的特殊环境。

它可以在不使用复杂的日历计算或内置日历函数的情况下快速计算出给定日期所对应的星期几。该算法通过对每一年分类讨论,利用闰年的特殊性质对日期进行计算,可以在 O(1) 时间复杂度内完成计算。

以下是C++代码示例:

#include <iostream>

int get_yday(int year, int month, int day)
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    year -= (month < 3);
    return (year + year/4 - year/100 + year/400 + t[month-1] + day) % 7;
}

int main()
{
    int year1, month1, day1;
    int year2, month2, day2;

    std::cout << "Enter first date (yyyy mm dd): ";
    std::cin >> year1 >> month1 >> day1;

    std::cout << "Enter second date (yyyy mm dd): ";
    std::cin >> year2 >> month2 >> day2;

    int days = get_yday(year2, month2, day2) - get_yday(year1, month1, day1);
    if (days < 0)
        days += 7;

    std::cout << "The number of days between the two dates is: " << days << std::endl;

    return 0;
}

以下是php版本

<?php

function dow(int $y, int $m, int $d): int
{
    static $t = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];
    $y = $y - ($m < 3);
    return ($y + intval($y/4) - intval($y/100) + intval($y/400) + $t[$m-1] + $d) % 7;
}

echo dow(2024, 8, 21);

引用:https://zhuanlan.zhihu.com/p/602344252

打赏本文
二维码