最近项目用到许多关于日期的相关计算,现在整理了一下,供大家参考下,后续慢慢补充……
<?php
/**
* 给定一个日期,获取下一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getNextDay($date) {
return date('Y-m-d', strtotime($date. ' +1 day'));
}
/**
* 给定一个日期,获取其本月的第一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getCurMonthFirstDay($date) {
return date('Y-m-01', strtotime($date));
}
/**
* 给定一个日期,获取其本月的最后一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getCurMonthLastDay($date) {
return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month -1 day'));
}
/**
* 给定一个日期,获取其下个月的第一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getNextMonthFirstDay($date) {
return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month'));
}
/**
* 给定一个日期,获取其下个月的最后一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getNextMonthLastDay($date) {
return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +2 month -1 day'));
}
/**
* 给定一个日期,获取其上个月的第一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getPrevMonthFirstDay($date) {
return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 month'));
}
/**
* 给定一个日期,获取其上个的最后一天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getPrevMonthLastDay($date) {
return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 day'));
}
/**
* 给定一个日期,获取星期几
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getDayByDate($date){
return date('N', strtotime($date));
}
/**
* 给定一个日期,获取该日期所在周的星期一日期
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function getMondayInWeekByDate($time){
$n = date('N', strtotime($time));
if($n == 1){
return $time;
}else{
$num = $n-1;
return date('Y-m-d',strtotime($time.'-'.$num.' day'));
}
}
/**
* 给定一个日期,获取该日期所在周的周末日期
* @param string $date 1970-01-01
* @author sensus
* @return array
*/
function getDayByDate($date){
$n = date('N', strtotime($date));
$sat = 6-$n;
$sun = 7-$n;
return array('saturday' => date('Y-m-d',strtotime($date.'+'.$sat.' day')),'sunday' => date('Y-m-d',strtotime($date.'+'.$sun.' day')));
}
/**
* 给定一年年份,判断该年是否为闰年
* @param string $date 1970
* @author sensus
* @return boolean
*/
function isLeapYear($year){
// 公历闰年的简单计算方法:(符合以下条件之一的年份即为闰年)
// 1.能被4整除而不能被100整除.(如2004年就是闰年,1900年不是)
// 2.能被400整除.(如2000年是闰年)
if (($year % 4 == 0) && ($year % 100 != 0) || ($year % 400 == 0)) {
return true;
} else {
return false;
}
}
/**
* 给定一个日期,距离下一年还有多少天
* @param string $date 1970-01-01
* @author sensus
* @return string
*/
function howManyDaysDistinceNextYear($data){
$year = date('Y',strtotime($data));
$getdate_arr = getdate(strtotime($data));
if(isLeapYear($year)){//闰年
return 366-$getdate_arr['yday'];
}else{//平年
return 365-$getdate_arr['yday'];
}
}
/**
* 给定两个日期,算出两个日期之间的所有日期
* @param [type] $start 起始时间
* @param [type] $end 结束时间
* @return array
*/
function getAllDatesByDoubleDates($start,$end){
$dt_start = strtotime($start);
$dt_end = strtotime($end);
if($dt_start > $dt_end){
$dt_end = strtotime($start);
$dt_start = strtotime($end);
}
while ($dt_start <= $dt_end){
$dates[] = date('Y-m-d',$dt_start);
$dt_start = strtotime('+1 day',$dt_start);
}
return $dates;
}
/**
* 给定两个日期,算出两个日期之间相差多少天
* @param [type] $start 起始时间
* @param [type] $end 结束时间
* @return string
*/
function countDaysBetweenDoubleDates($start,$end){
$dt_start = strtotime($start);
$dt_end = strtotime($end);
$count = 0;
if($dt_start > $dt_end){
$dt_end = strtotime($start);
$dt_start = strtotime($end);
}
while ($dt_start < $dt_end){
$count++;
$dt_start = strtotime('+1 day',$dt_start);
}
return $count;
}
/**
* 获取今年的所有星期几
* @param [type] $day 星期几的英文单词(不分大小写)
* @return string
*/
function getAllDatesByDay($day = 'monday'){
$current_year = date('Y');
$first=date('Y-m-d',strtotime('this '.$day,strtotime($current_year."-01-01")));
$days = array();
for($i = 0;;$i += 7){
$current_time = strtotime($i.' days',strtotime($first));
if($current_time > strtotime($current_year.'-12-31')){
break;
}
$days[] = date('Y-m-d',$current_time);
}
return $days;
}
/**
* 获取交集的时长,两个固定时间段,一个动态时间段,求交集部分时长,如钉钉请假的时长计算
* @param [array] $moveTime [动态时间段],如["09:30", "15:00"]
* @param [array] $silentTime1 [固定时间段1],如["09:00", "11:30"]
* @param [array] $silentTime2 [固定时间段2],如["13:30", "18:00"]
* @return [float|null] [交集时长,单位为小时]
*/
function getIntersectionAmongThreeTime($moveTime, $silentTime1, $silentTime2) {
$m1 = strtotime($moveTime[0]);
$m2 = strtotime($moveTime[1]);
$a1 = strtotime($silentTime1[0]);
$a2 = strtotime($silentTime1[1]);
$b1 = strtotime($silentTime2[0]);
$b2 = strtotime($silentTime2[1]);
$amWorkHour = round(($a2 - $a1) / 3600, 2);//上午工作时长,单位为小时
$pmWorkHour = round(($b2 - $b1) / 3600, 2);//下午工作时长,单位为小时
$dayWorkHour = $amWorkHour + $pmWorkHour;//每天的工作时长,单位为小时
if ($m1 <= $a1 && $m2 >= $b2) {
$intersection = $dayWorkHour;
} else if ($m1 > $a1 && $m1 < $a2 && $m2 >= $b2) {
$intersection = round(($a2 - $m1) / 3600, 2) + $pmWorkHour;
} else if ($m1 >= $a2 && $m1 <= $b1 && $m2 >= $b2) {
$intersection = $pmWorkHour;
} else if ($m1 > $b1 && $m1 < $b2 && $m2 >= $b2) {
$intersection = round(($b2 - $m1) / 3600, 2);
} else if ($m1 <= $a1 && $m2 > $b1 && $m2 < $b2) {
$intersection = $amWorkHour + round(($m2 - $b1) / 3600, 2);
} else if ($m1 <= $a1 && $m2 >= $a2 && $m2 <= $b1) {
$intersection = $amWorkHour;
} else if ($m1 <= $a1 && $m2 > $a1 && $m2 < $a2) {
$intersection = round(($m2 - $a1) / 3600, 2);
} else if ($m1 > $a1 && $m1 < $a2 && $m2 > $b1 && $m2 < $b2) {
$intersection = round(($a2 - $m1) / 3600, 2) + round(($m2 - $b1) / 3600, 2);
} else if ($m1 > $a1 && $m2 < $a2 || $m1 > $b1 && $m2 < $b2) {
$intersection = round(($m2 - $m1) / 3600, 2);
} else if ($m1 > $a1 && $m1 < $a2 && $m2 >= $a2 && $m2 <= $b1) {
$intersection = round(($a2 - $m1) / 3600, 2);
} else if ($m1 >= $a2 && $m1 <= $b1 && $m2 > $b1 && $m2 < $b2) {
$intersection = round(($m2 - $b1) / 3600, 2);
}
return $intersection;
}