某一天是星期几 && php的整除
最近在写日程管理系统,其中有个蛮有趣的问题,如何知道某一天是星期几?
假设日期是2010-5-17,php中用date函数可以轻松得得到。date函数的用法:
string date ( string $format [, int $timestamp ] )
$format为”w”时,可以获取timestamp对应的星期的数字编号,0代表Sunday,1代表Monday…6表示Saturday。date(“w”,mktime(1,1,1,5,17,2010))就可以获取2010-5-17所对应的星期了。
记得之前sandy推荐给我看的linux下mktime实现的源码分析中,提到了一个magic number,还有神奇的Gauss算法。温习时发现了很多讨论某一天是星期几的算法。其中比较著名的有基姆拉尔森计算公式和蔡勒公式。
——————————以下摘自百度百科——————————
基姆拉尔森计算公式:
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。在公式中有个与其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。结果中0表示Monday , 1 表示 Tuesday … 6表示Sunday,跟date函数的不同。
蔡勒公式如下:
W = [C/4] – 2C + y + [y/4] + [13 * (M+1) / 5] + d – 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪-1(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。
——————————以上摘自百度百科——————————
用php实现了下:
function day2week($year,$month,$day){ if($month <= 0 ){ $year = $year - 1; $month += 12 ; } $w = (int)($day + 2*$month +3*(int)($month+1)/5 + $year + (int)$year/4 - $year/100 + $year/400) % 7; return $w; }
但测试时发现结果不对头。跟sandy讨论了会儿,发现用C语言实现的程序运行结果是正确的,才想到是php的整除的问题,php的动态类型的机制,“/”之类的结果是浮点类型的。要想得到和C语言一样的整除的效果,就要配合floor和ceil两个取整函数了。C中取整都是向0靠拢,也就是说如果结果是负数,就取大于等于结果的最小整数;结果是正数,就取小于等于结果的最大整数。一个php中的类似实现:
<?php function rst2int($a ,$b){ if ($b < 1e-9) return "error"; $rst = $a/$b ; return $rst > 0 ? floor($rst) : ceil($rst); } echo rst2int(-3,4) . "\n"; echo rst2int(-3,0) . "\n"; echo rst2int(3,4) . "\n"; ?>
写脚本的时候还是要特别注意才好啊~
看完了^.^,如果觉得这篇文章对你有用或者有
问题,请留言告诉我,thank you !
文章为原创的话,转载请注明出处.不敢流泪-《某一天是星期几 && php的整除》