检查验证日期格式或时间是否正确:

/**

* 验证日期函数

* @param $date    日期

* @param $format = 'Y-m-d H:i:s'

* @return boolean

*/

public function validateDate($date, $format = 'Y-m-d'){

        $d = \DateTime::createFromFormat($format, $date);

        return $d && $d->format($format) == $date;

}


日期类:

<?php
class Calendar
{
	private $year;
	private $month;
	private $weeks  = array('日','一','二','三','四','五','六');
	 
	function __construct($options = array(),$sign_days = array()) {
		$this->year = date('Y');
		$this->month = date('m');
		$this->sign_days = $sign_days;
		$vars = get_class_vars(get_class($this));
		foreach ($options as $key=>$value) {
			if (array_key_exists($key, $vars)) {
				$this->$key = $value;
			}
		}
	}
	 
	function display()
	{
		$str = '<table class="calendar">';
		$str .= $this->showChangeDate();
		$str .= $this->showWeeks();
		$str .= $this->showDays($this->year,$this->month);
		return $str .= '</table>';
	}
	 
	private function showWeeks()
	{
		$str = '<tr>';
		foreach($this->weeks as $title)
		{
			$str .= '<th>'.$title.'</th>';
		}
		return $str .= '</tr>';
	}
	 
	private function showDays($year, $month)
	{
		$firstDay = mktime(0, 0, 0, $month, 1, $year);
		$starDay = date('w', $firstDay);
		$days = date('t', $firstDay);
		
		$str = '<tr>';
		for ($i=0; $i<$starDay; $i++) {
			$str .= '<td>&nbsp;</td>';
		}
		 
		$now = date('Y-m-d',time());
		for ($j=1; $j<=$days; $j++) {
			$i++;
			if (date('Y-m-d',strtotime("$year-$month-$j")) == $now) {
				if(in_array($j,$this->sign_days)){
					$str .= '<td class="todaysign">'.$j.'</td>';
				}else{
					$str .= '<td class="today"><a href="javascript:;" id="sign">'.$j.'</a></td>';
				}
			} else {
				// 显示已近签到过的
				if(in_array($j,$this->sign_days)){
					$str .= '<td class="sign">'.$j.'</td>';
				}else{
					$str .= '<td>'.$j.'</td>';
				}
			}
			if ($i % 7 == 0) {
				$str .= '</tr><tr>';
			}
		}
		 
		return $str .= '</tr>';
	}
	 
	private function showChangeDate()
	{
		 
		$url = basename($_SERVER['PHP_SELF']);
		 
		$str = '<tr>';
		$str .= '<td><a href="?'.$this->preYearUrl($this->year,$this->month).'">'.'<<'.'</a></td>';
		$str .= '<td><a href="?'.$this->preMonthUrl($this->year,$this->month).'">'.'<'.'</a></td>';
		$str .= '<td colspan="3"><form>';
		 
		$str .= '<select name="year" onchange="window.location=\''.$url.'?year=\'+this.options[selectedIndex].value+\'&month='.$this->month.'\'">';
		for($ye=1970; $ye<=2038; $ye++) {
			$selected = ($ye == $this->year) ? 'selected' : '';
			$str .= '<option '.$selected.' value="'.$ye.'">'.$ye.'</option>';
		}
		$str .= '</select>';
		$str .= '<select name="month" onchange="window.location=\''.$url.'?year='.$this->year.'&month=\'+this.options[selectedIndex].value+\'\'">';
		 
 
		 
		for($mo=1; $mo<=12; $mo++) {
			$selected = ($mo == $this->month) ? 'selected' : '';
			$str .= '<option '.$selected.' value="'.$mo.'">'.$mo.'</option>';
		}
		$str .= '</select>';
		$str .= '</form></td>';
		$str .= '<td><a href="?'.$this->nextMonthUrl($this->year,$this->month).'">'.'>'.'</a></td>';
		$str .= '<td><a href="?'.$this->nextYearUrl($this->year,$this->month).'">'.'>>'.'</a></td>';
		return $str .= '</tr>';
	}
	 
	private function preYearUrl($year,$month)
	{
		$year = ($this->year <= 1970) ? 1970 : $year - 1 ;
		 
		return 'year='.$year.'&month='.$month;
	}
	 
	private function nextYearUrl($year,$month)
	{
		$year = ($year >= 2038)? 2038 : $year + 1;
		 
		return 'year='.$year.'&month='.$month;
	}
	 
	private function preMonthUrl($year,$month)
	{
		if ($month == 1) {
			$month = 12;
			$year = ($year <= 1970) ? 1970 : $year - 1 ;
		} else {
			$month--;
		}        
		 
		return 'year='.$year.'&month='.$month;
	}
	 
	private function nextMonthUrl($year,$month)
	{
		if ($month == 12) {
			$month = 1;
			$year = ($year >= 2038) ? 2038 : $year + 1;
		}else{
			$month++;
		}
		return 'year='.$year.'&month='.$month;
	}
	 
}