在实际工作中经常会碰到时间的计算,电子商务系统的时候经常会碰到要月结的情况,可能就会涉及到月初时间和月末时间的计算。游戏系统每周要刷新数据,涉及到每周开始和结束时间的计算。 还有像诸如月排行、周排行、日排行都会涉及到相应的时间计算,下面分享一些自己总结出来的方法。
月初时间戳计算
月初的时间戳好计算,直接用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 "
";
//获取今天是今年的第几天
echo date("z");
echo "
";
//获取今天是本周的第几天
echo date("N");
echo "
";
date加上时间戳参数后就可以获取时间戳对应的一些信息,功能蛮强大的。知道今天是本周的第几天,就可以很容易的计算出本周的开始时间了,然后就可以高一些周排行之类的数据了。