在实际工作中经常会碰到时间的计算,电子商务系统的时候经常会碰到要月结的情况,可能就会涉及到月初时间和月末时间的计算。游戏系统每周要刷新数据,涉及到每周开始和结束时间的计算。 还有像诸如月排行、周排行、日排行都会涉及到相应的时间计算,下面分享一些自己总结出来的方法。
月初时间戳计算
月初的时间戳好计算,直接用date和strtotime函数就可以得到,date的时间格式除了年月为动态的外,其余天设置为01,小时分钟秒设置为00:00:00
/** * 月初时间戳计算 * * @param int $time 时间戳 * @return int 月初时间戳 */ function getMonthStart($time) { return strtotime(date("Y-m-01 00:00:00", $time)); }
每月有几天
计算每月有几天,通常会想到根据月份来进行计算,在计算2月份的时候还要判断是否为闰年。当然也可以通过php内置函数cal_days_in_month直接计算:
/** * 计算每月有几天 * * @param int $time 时间戳 * @return int */ function getMonthDay($time) { return cal_days_in_month(CAL_GREGORIAN, date("m", $time), date("Y", $time)); }
也可以使用date(“t”, $time)来进行计算,使用内置的函数通常来说性能更快,bug更少。不过也可以了解一下其中的原理。
月末时间计算
月初时间戳加上每月的秒数,实际上就是上面两个方法的集合
$time = time(); $monthStart = strtotime(date("Y-m-01 00:00:00", $time)); $monthSecond = 86400 * cal_days_in_month(CAL_GREGORIAN, date("m", $time), date("Y", $time)); echo $monthStart + $monthSecond - 1;
判断时间格式是否正确
一般在前端都是让用户使用时间控件进行选择,但是服务端还是进行相应的校验比较严谨,比如2015-02-30就是不合法的时间。
/** * 校验日期格式是否正确 * * @param string $date 日期 * @param string $formats 需要检验的格式数组 * @return boolean */ function checkDateIsValid($date, $formats = array("Y-m-d", "Y/m/d")) { $unixTime = strtotime($date); if (!$unixTime) { //strtotime转换不对,日期格式显然不对。 return false; } //校验日期的有效性,只要满足其中一个格式就OK foreach ($formats as $format) { if (date($format, $unixTime) == $date) { return true; } } return false; }
微秒计算
date函数只能取到秒,如果要精确到微秒级别可以使用microtime函数
//本例输出182947 echo getMicroSecond(true); /** * 获取当前微秒数 * * @param bool $isWithLeadingZeros 是否需要补齐前导0 * @return string */ function getMicroSecond($isWithLeadingZeros = false) { $microTime = microtime(); $a = explode(" ", $microTime); $microSecond = $a[0] * 1000000; if ($isWithLeadingZeros) { while (strlen($microSecond) < 6) { $microSecond = "0" . $microSecond; } } return $microSecond; }
计算今天是本周的第几天
php的内置函数date非常强大,除了格式化时间显示外,还可以通过各种参数获取不用的时间数据,例如可以通过W获取本周是今年的第几周,z参数获取今天是今年的第几天,N参数获取今天是本周的第几天
date_default_timezone_set("Asia/Shanghai"); //获取本周是今年的第几周 echo date("W"); echo "<br />"; //获取今天是今年的第几天 echo date("z"); echo "<br />"; //获取今天是本周的第几天 echo date("N"); echo "<br />";
date加上时间戳参数后就可以获取时间戳对应的一些信息,功能蛮强大的。知道今天是本周的第几天,就可以很容易的计算出本周的开始时间了,然后就可以高一些周排行之类的数据了。
转载请注明:快乐编程 » php中关于时间计算的常用方法