Lewis Carroll在PHP中使用“星期几”算法
LewisCarroll设计了一种机制来计算给定特定日期的星期几,并于1887年在《科学》上发表。这是一个PHP函数,它使用给定日期的星期几进行计算,并使用与LewisCarroll设计的相同的机制。该机制不是很复杂,但是我没有在代码上解释两次,而是在代码中添加了很多注释以指示发生了什么。
function dayOfWeek($date)
{
$total = 0;
$date = explode('/', $date);
if ( $date[0] 7 ) {
$total = $total % 7;
}
//提取年份
$year = $date[0] % 100;
//除以12,将其加到余数,在余数中加4的个数
$year = (((int)($year/12)) + ($year%12) + ((int)(($year%12)/4)));
//将年份加到总数中
$total = $centry + $year;
//如果总数大于7,则除以7并除以余数
if ( $total >= 7 ) {
$total = $total % 7;
}
//提取月份
$month = $date[1];
//从表中选择月份
$monthTable = array(0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5);
$month = $monthTable[(int)$month - 1];
//将月份加总
$total = $total + $month;
//提取日
$day = $date[2];
//如果年份是a年,月份是一月或二月,则减去1。
if ( $date[0]%4==0 ) {
if ( $date[0]%100 == 0 ) {
if ( $date[0]%400 == 0 ) {
if ( $date[1] == 1 || $date[1] == 2 ) {
$day = $day - 1;
}
}
} else {
if ( $date[1] == 1 || $date[1] == 2 ) {
$day = $day-1;
}
}
}
//加到总计
$total = $total + $day;
//如果总数大于7,则除以7并除以余数
if ( $total >= 7 ) {
$total = $total % 7;
}
//将天数转换为天
$days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
return $days[$total];
}通过以YYYY/MM/DD格式指定日期来使用该功能。这里有几个例子。
echo dayOfWeek('1979/07/13');
echo ' ';
echo dayOfWeek('2008/05/12');
echo ' ';
echo dayOfWeek('1640/02/06');打印输出:WednesdayMondayThursday月份表摘自悉尼大学的示例页面。如果您想详细了解算法的工作原理,则此页面也很有用。
请注意,如果日期早于1752年,则需要将数字减去18。这是因为公历是1752年通过删除9月3日至13日之间的日期而修改的。但是,并非所有国家/地区都参与了此更新。