之前做项目的时候需要用到与日历有关的数据,就网上查了一些资料,整合起来写了一个日历类。下面是日历类的源代码以及它的一些用法的demo。
- 日历类Calendar.php
<?php
/**
* Class Calendar - 日历类
*/
class Calendar {
public $months = array( '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' );
/**
* Calendar constructor.
* 构造函数
*/
function __construct(){
}
/**
* @param $year
* @param $month
* @return array
* 参数 $year 必填,参数 $month 选填;
* 当参数只有一个时,返回 $year 年一整年的日历
* 当参数为两个时,返回 $year 年 $month 月的日历
*/
public function getCalendar($year, $month){
$year = intval($year);
$month = intval($month);
$days = array(31, (strtotime("1 Mar " . $year) - strtotime("1 Feb " . $year)) / ( 24 * 60 * 60 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$wday = array( '', '', '', '', '', '', '' );
$cal = array();
if($month >= 1 && $month <= 12){
$firstday = getdate(strtotime($year . '-' . $month . '-' . '1'));
$fromday = $firstday['wday'];
$leftday = 7 - ($fromday + $days[$month - 1]) % 7;
$cal = array_merge(array_slice($wday, 0, $fromday),
range(1, $days[$month - 1]),
array_slice($wday, 0, $leftday)
);
$data = array(
'year' => $year,
'month' => $this->months[$month - 1],
'cal' => $cal,
);
}else {
foreach (range(0, 11) as $i) {
$firstday = getdate(strtotime($year . '-' . ($i + 1) . '-' . '1'));
$fromday = $firstday['wday'];
$leftday = 7 - ($fromday + $days[$i]) % 7;
$cal[] = array_merge(array_slice($wday, 0, $fromday),
range(1, $days[$i]),
array_slice($wday, 0, $leftday)
);
}
$data = array(
'year' => $year,
'month' => $this->months,
'cal' => $cal,
);
}
return $data;
}
/**
* 获取 $year 年的所有周六、周日的日期
* @param $year
* @return array
*/
public function getWeekend($year){
$first_sat = date('Y-m-d',strtotime('this Saturday', strtotime($year . '-01-01')));
$sat = array();
for($i = 0; ; $i += 7){
$sat_current_time = strtotime($i . ' days', strtotime($first_sat));
if($sat_current_time > strtotime($year . '-12-31')){
break;
}
$sat[] = date('Y-n-j', $sat_current_time);
}
$first_sun = date('Y-m-d',strtotime('this Sunday', strtotime($year . '-01-01')));
$sun = array();
for($i = 0; ; $i += 7){
$sun_current_time = strtotime($i . ' days', strtotime($first_sun));
if($sun_current_time > strtotime($year . '-12-31')){
break;
}
$sun[] = date('Y-n-j', $sun_current_time);
}
$weekend = array(
'sat' => $sat,
'sun' => $sun,
);
return $weekend;
}
/**
* 求两个日期之间的天数(包括头尾两天);如2016-09-01到2016-09-03为3天
* (针对1970年1月1日之后,求之前可以采用泰勒公式)
* @param string $day1
* @param string $day2
* @return number
*/
public function diffBetweenTwoDays ($day1, $day2)
{
$second1 = strtotime($day1);
$second2 = strtotime($day2);
if ($second1 > $second2) {
$tmp = $second2;
$second2 = $second1;
$second1 = $tmp;
}
return ($second2 - $second1) / 86400 + 1;
}
/**
* 返回两个日期之间的日期数组
* @param $start
* @param $end
* @return array
*/
public function getDatesArray($start, $end){
$dt_start = strtotime($start);
$dt_end = strtotime($end);
if ($dt_start > $dt_end) { //防止开始时间和结束时间写颠倒
$tmp = $dt_end;
$dt_end = $dt_start;
$dt_start = $tmp;
}
while ($dt_start <= $dt_end){
$dateArray[] = date('Y-m-d', $dt_start);
$dt_start = strtotime('+1 day',$dt_start);
}
return $dateArray;
}
}
- 调用日历类输出某一年或某一个月的日历demo
<?php
if(isset($_POST['year'])){
$calendar = new Calendar();
if(isset($_POST['month'])){
$data = $calendar->getCalendar($_POST['year'], $_POST['month']); // 输出某一年某一个月的日历
}else {
$data = $calendar->getCalendar($_POST['year']); // 输出一整年的日历
}
$year = $data['year'];
$months = $data['month'];
$cal = $data['cal'];
}
?>
<form method="post" action="">
<input name="year" value="<?php echo $_POST['year']; ?>" type="text" style="width: 60px;" placeholder="年"> <input name="month" type="text" value="<?php echo $_POST['month']; ?>" style="width: 60px;" placeholder="月"> <input type="submit" value="提交">
</form>
<?php if(is_array($months)){ ?>
<div style="width: 750px; position: relative; float: left;">
<?php foreach(range(0, 11) as $i) : ?>
<div style="position: relative; float: left; margin-right: 20px; margin-top: 20px; height: 178px; border: 1px silver solid;">
<table>
<thead>
<tr><th colspan="7"><?php echo $months[$i].' '.$year.'年'; ?></th></tr>
<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th>
</thead>
<tbody>
<tr>
<?php
foreach($cal[$i] as $k => $v) {
if($k && !($k % 7)){
echo "</tr><tr>";
}
if(($year == date('Y')) && ($i == (date('n') -1)) && ($v == date('j'))) {
echo "<td style='color: red;'>$v</td>";
}else{
echo "<td>$v</td>";
}
}
?>
</tr>
</tbody>
</table>
</div>
<?php endforeach ?>
</div>
<?php }else if(!empty($months)){ ?>
<div style="position: relative; float: left; margin-right: 20px; margin-top: 20px; height: 178px; border: 1px silver solid;">
<table>
<thead>
<tr><th colspan="7"><?php echo $months.' '.$year.'年'; ?></th></tr>
<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th>
</thead>
<tbody>
<tr>
<?php
foreach($cal as $k => $v) {
if($k && !($k % 7)){
echo "</tr><tr>";
}
echo "<td>$v</td>";
}
?>
</tr>
</tbody>
</table>
</div>
<?php } ?>
- 调用日历类获取某一年的周六周日的日期demo
<form method="post" action="">
year:<input name="year" value="<?php echo $_POST['year']; ?>" type="text" style="width: 60px;" placeholder="年"> <input type="submit" value="提交">
</form>
<?php
if(isset($_POST['year'])){
$year = $_POST['year'];
$calendar = new Calendar();
$weekend = $calendar->getWeekend($year);
print_r($weekend);
}
- 调用日历类求两个日期之间的天数(包括头尾两天);如2016-09-01到2016-09-03为3天demo
<form method="post" action="">
day1:<input name="day1" value="<?php echo $_POST['day1']; ?>" type="text" style="width: 120px;" placeholder="日期1"> day1:<input name="day2" value="<?php echo $_POST['day2']; ?>" type="text" style="width: 120px;" placeholder="日期2"> <input type="submit" value="提交">
</form>
<?php
if(isset($_POST['day1']) && isset($_POST['day2'])){
$day1 = $_POST['day1'];
$day2 = $_POST['day2'];
$calendar = new Calendar();
$diff = $calendar->diffBetweenTwoDays($day1, $day2);
echo $day1 . '到' . $day2 . '为' . $diff . '天';
}
?>
- 返回两个日期之间的日期数组demo
<form method="post" action="">
day1:<input name="day1" value="<?php echo $_POST['day1']; ?>" type="text" style="width: 120px;" placeholder="日期1"> day1:<input name="day2" value="<?php echo $_POST['day2']; ?>" type="text" style="width: 120px;" placeholder="日期2"> <input type="submit" value="提交">
</form>
<?php
if(isset($_POST['day1']) && isset($_POST['day2'])){
$day1 = $_POST['day1'];
$day2 = $_POST['day2'];
$calendar = new Calendar();
$days = $calendar->getDatesArray($day1, $day2);
print_r($days);
}
?>