📄 calc.php
字号:
/** * Returns the number of rows on a calendar month. Useful for * determining the number of rows when displaying a typical * month calendar. * * @param string month in format MM, default current local month * @param string year in format YYCC, default current local year * * @access public * * @return int number of weeks */ function weeksInMonth($month="",$year="",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; if($fdow == 1) { if(Date_Calc::firstOfMonthWeekday($month,$year) == 0) $first_week_days = 1; else $first_week_days = 7 - (Date_Calc::firstOfMonthWeekday($month,$year) - 1); } else $first_week_days = 7 - Date_Calc::firstOfMonthWeekday($month,$year); return ceil(((Date_Calc::daysInMonth($month,$year) - $first_week_days) / 7) + 1); } // end func weeksInMonth /** * Find the day of the week for the first of the month of given date. * * @param string year in format CCYY, default to current local year * @param string month in format MM, default to current local month * * @access public * * @return int number of weekday for the first day, 0=Sunday */ function firstOfMonthWeekday($month="",$year="") { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); return(Date_Calc::dayOfWeek("01",$month,$year)); } // end func firstOfMonthWeekday /** * Return date of first day of month of given date. * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string format for returned date * * @access public * * @return string date in given format */ function beginOfMonth($month="",$year="",$format="%Y%m%d") { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); return(Date_Calc::dateFormat("01",$month,$year,$format)); } // end of func beginOfMonth /** * Find the month day of the beginning of week for given date, * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.) * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string day in format DD, default current local day * @param string format for returned date * * @access public * * @return string date in given format */ function beginOfWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $this_weekday = Date_Calc::dayOfWeek($day,$month,$year); if($fdow == 1) { if($this_weekday == 0) $beginOfWeek = Date_Calc::dateToDays($day,$month,$year) - 6; else $beginOfWeek = Date_Calc::dateToDays($day,$month,$year) - $this_weekday + 1; } else $beginOfWeek = (Date_Calc::dateToDays($day,$month,$year) - $this_weekday); /* $beginOfWeek = (Date_Calc::dateToDays($day,$month,$year) - ($this_weekday - $fdow)); */ return(Date_Calc::daysToDate($beginOfWeek,$format)); } // end of func beginOfWeek /** * Find the month day of the end of week for given date, * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday * of following month.) * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string day in format DD, default current local day * @param string format for returned date * * @access public * * @return string date in given format */ function endOfWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $this_weekday = Date_Calc::dayOfWeek($day,$month,$year); $last_dayOfWeek = (Date_Calc::dateToDays($day,$month,$year) + (6 - $this_weekday + $fdow)); return(Date_Calc::daysToDate($last_dayOfWeek,$format)); } // end func endOfWeek /** * Find the month day of the beginning of week after given date, * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.) * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string day in format DD, default current local day * @param string format for returned date * * @access public * * @return string date in given format */ function beginOfNextWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day+7,$month,$year),"%Y%m%d"); $next_week_year = substr($date,0,4); $next_week_month = substr($date,4,2); $next_week_day = substr($date,6,2); $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year); $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year) - ($this_weekday - $fdow)); return(Date_Calc::daysToDate($beginOfWeek,$format)); } // end func beginOfNextWeek /** * Find the month day of the beginning of week before given date, * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.) * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string day in format DD, default current local day * @param string format for returned date * * @access public * * @return string date in given format */ function beginOfPrevWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day-7,$month,$year),"%Y%m%d"); $next_week_year = substr($date,0,4); $next_week_month = substr($date,4,2); $next_week_day = substr($date,6,2); $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year); $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year) - ($this_weekday - $fdow)); return(Date_Calc::daysToDate($beginOfWeek,$format)); } // end func beginOfPrevWeek /** * Return an array with days in week * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string day in format DD, default current local day * @param string format for returned date * * @access public * * @return array $week[$weekday] */ function getCalendarWeek($day="",$month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $week_array = array(); // date for the column of week $curr_day = Date_Calc::beginOfWeek($day,$month,$year,"%E",$fdow); for($counter=0; $counter <= 6; $counter++) { $week_array[$counter] = Date_Calc::daysToDate($curr_day,$format); $curr_day++; } return $week_array; } // end func getCalendarWeek /** * Return a set of arrays to construct a calendar month for * the given date. * * @param string year in format CCYY, default current local year * @param string month in format MM, default current local month * @param string format for returned date * * @access public * * @return array $month[$row][$col] */ function getCalendarMonth($month="",$year="",$format="%Y%m%d",$fdow=null) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if($fdow === null) $fdow = DATE_CALC_BEGIN_WEEKDAY; $month_array = array(); // date for the first row, first column of calendar month if($fdow == 1) { if(Date_Calc::firstOfMonthWeekday($month,$year) == 0) $curr_day = Date_Calc::dateToDays("01",$month,$year) - 6; else $curr_day = Date_Calc::dateToDays("01",$month,$year) - Date_Calc::firstOfMonthWeekday($month,$year) + 1; } else $curr_day = (Date_Calc::dateToDays("01",$month,$year) - Date_Calc::firstOfMonthWeekday($month,$year)); // number of days in this month $daysInMonth = Date_Calc::daysInMonth($month,$year); $weeksInMonth = Date_Calc::weeksInMonth($month,$year,$fdow); for($row_counter=0; $row_counter < $weeksInMonth; $row_counter++) { for($column_counter=0; $column_counter <= 6; $column_counter++) { $month_array[$row_counter][$column_counter] = Date_Calc::daysToDate($curr_day,$format); $curr_day++; } } return $month_array; } // end func getCalendarMonth /** * Return a set of arrays to construct a calendar year for * the given date. * * @param string year in format CCYY, default current local year * @param string format for returned date * * @access public * * @return array $year[$month][$row][$col] */ function getCalendarYear($year="",$format="%Y%m%d") { if(empty($year)) $year = Date_Calc::dateNow("%Y"); $year_array = array(); for($curr_month=0; $curr_month <=11; $curr_month++) $year_array[$curr_month] = Date_Calc::getCalendarMonth(sprintf("%02d",$curr_month+1),$year,$format); return $year_array; } // end func getCalendarYear /** * Converts a date to number of days since a * distant unspecified epoch. * * @param string year in format CCYY * @param string month in format MM * @param string day in format DD * * @access public * * @return integer number of days */ function dateToDays($day,$month,$year) { $century = substr($year,0,2); $year = substr($year,2,2); if($month > 2) $month -= 3; else { $month += 9; if($year) $year--; else { $year = 99; $century --; } } return ( floor(( 146097 * $century) / 4 ) + floor(( 1461 * $year) / 4 ) + floor(( 153 * $month + 2) / 5 ) + $day + 1721119);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -