某一天是星期几 && 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";
?>

写脚本的时候还是要特别注意才好啊~

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

click to changeSecurity Code