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日之间的日期而修改的。但是,并非所有国家/地区都参与了此更新。