date = $this->parse($date); $this->setDate($this->date); } /** * 日期分析 * 返回时间戳 * @static * @access public * @param mixed $date 日期 * @return string */ public function parse($date) { if (is_string($date)) { if (($date == "") || strtotime($date) == -1) { //为空默认取得当前时间戳 $tmpdate = time(); } else { //把字符串转换成UNIX时间戳 $tmpdate = strtotime($date); } } elseif (is_null($date)) { //为空默认取得当前时间戳 $tmpdate = time(); } elseif (is_numeric($date)) { //数字格式直接转换为时间戳 $tmpdate = $date; } else { if (get_class($date) == "Date") { //如果是Date对象 $tmpdate = $date->date; } else { //默认取当前时间戳 $tmpdate = time(); } } return $tmpdate; } /** * 验证日期数据是否有效 * @access public * @param mixed $date 日期数据 * @return string */ public function valid($date) { } /** * 日期参数设置 * @static * @access public * @param integer $date 日期时间戳 * @return void */ public function setDate($date) { $dateArray = getdate($date); $this->date = $dateArray[0]; //时间戳 $this->second = $dateArray["seconds"]; //秒 $this->minute = $dateArray["minutes"]; //分 $this->hour = $dateArray["hours"]; //时 $this->day = $dateArray["mday"]; //日 $this->month = $dateArray["mon"]; //月 $this->year = $dateArray["year"]; //年 $this->weekday = $dateArray["wday"]; //星期 0~6 $this->cWeekday = '星期' . $this->Week[$this->weekday]; //$dateArray["weekday"]; //星期完整表示 $this->yDay = $dateArray["yday"]; //一年中的天数 0-365 $this->cMonth = $dateArray["month"]; //月份的完整表示 $this->CDATE = $this->format("%Y-%m-%d"); //日期表示 $this->YMD = $this->format("%Y%m%d"); //简单日期 $this->CTIME = $this->format("%H:%M:%S"); //时间表示 return; } /** * 日期格式化 * 默认返回 1970-01-01 11:30:45 格式 * @access public * @param string $format 格式化参数 * @return string */ public function format($format = "%Y-%m-%d %H:%M:%S") { return strftime($format, $this->date); } /** * 是否为闰年 * @static * @access public * @return string */ public function isLeapYear($year = '') { if (empty($year)) { $year = $this->year; } return ((($year % 4) == 0) && (($year % 100) != 0) || (($year % 400) == 0)); } /** * 计算日期差 * * w - weeks * d - days * h - hours * m - minutes * s - seconds * @static * @access public * @param mixed $date 要比较的日期 * @param string $elaps 比较跨度 * @return integer */ public function dateDiff($date, $elaps = "d") { $__DAYS_PER_WEEK__ = (7); $__DAYS_PER_MONTH__ = (30); $__DAYS_PER_YEAR__ = (365); $__HOURS_IN_A_DAY__ = (24); $__MINUTES_IN_A_DAY__ = (1440); $__SECONDS_IN_A_DAY__ = (86400); //计算天数差 $__DAYSELAPS = ($this->parse($date) - $this->date) / $__SECONDS_IN_A_DAY__; switch ($elaps) { case "y": //转换成年 $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_YEAR__; break; case "M": //转换成月 $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_MONTH__; break; case "w": //转换成星期 $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_WEEK__; break; case "h": //转换成小时 $__DAYSELAPS = $__DAYSELAPS * $__HOURS_IN_A_DAY__; break; case "m": //转换成分钟 $__DAYSELAPS = $__DAYSELAPS * $__MINUTES_IN_A_DAY__; break; case "s": //转换成秒 $__DAYSELAPS = $__DAYSELAPS * $__SECONDS_IN_A_DAY__; break; } return $__DAYSELAPS; } /** * 人性化的计算日期差 * @static * @access public * @param mixed $time 要比较的时间 * @param mixed $precision 返回的精度 * @return string */ public function timeDiff($time, $precision = false) { if (!is_numeric($precision) && !is_bool($precision)) { static $_diff = array('y' => '年', 'M' => '个月', 'd' => '天', 'w' => '周', 's' => '秒', 'h' => '小时', 'm' => '分钟'); return ceil($this->dateDiff($time, $precision)) . $_diff[$precision] . '前'; } $diff = abs($this->parse($time) - $this->date); static $chunks = array(array(31536000, '年'), array(2592000, '个月'), array(604800, '周'), array(86400, '天'), array(3600, '小时'), array(60, '分钟'), array(1, '秒')); $count = 0; $since = ''; for ($i = 0; $i < count($chunks); $i++) { if ($diff >= $chunks[$i][0]) { $num = floor($diff / $chunks[$i][0]); $since .= sprintf('%d' . $chunks[$i][1], $num); $diff = (int) ($diff - $chunks[$i][0] * $num); $count++; if (!$precision || $count >= $precision) { break; } } } return $since . '前'; } /** * 返回周的某一天 返回Date对象 * @access public * @return Date */ public function getDayOfWeek($n) { $week = array(0 => 'sunday', 1 => 'monday', 2 => 'tuesday', 3 => 'wednesday', 4 => 'thursday', 5 => 'friday', 6 => 'saturday'); return (new Date($week[$n])); } /** * 计算周的第一天 返回Date对象 * @access public * @return Date */ public function firstDayOfWeek() { return $this->getDayOfWeek(1); } /** * 计算月份的第一天 返回Date对象 * @access public * @return Date */ public function firstDayOfMonth() { return (new Date(mktime(0, 0, 0, $this->month, 1, $this->year))); } /** * 计算年份的第一天 返回Date对象 * @access public * @return Date */ public function firstDayOfYear() { return (new Date(mktime(0, 0, 0, 1, 1, $this->year))); } /** * 计算周的最后一天 返回Date对象 * @access public * @return Date */ public function lastDayOfWeek() { return $this->getDayOfWeek(0); } /** * 计算月份的最后一天 返回Date对象 * @access public * @return Date */ public function lastDayOfMonth() { return (new Date(mktime(0, 0, 0, $this->month + 1, 0, $this->year))); } /** * 计算年份的最后一天 返回Date对象 * @access public * @return Date */ public function lastDayOfYear() { return (new Date(mktime(0, 0, 0, 1, 0, $this->year + 1))); } /** * 计算月份的最大天数 * @access public * @return integer */ public function maxDayOfMonth() { $result = $this->dateDiff(strtotime($this->dateAdd(1, 'm')), 'd'); return $result; } /** * 取得指定间隔日期 * * yyyy - 年 * q - 季度 * m - 月 * y - day of year * d - 日 * w - 周 * ww - week of year * h - 小时 * n - 分钟 * s - 秒 * @access public * @param integer $number 间隔数目 * @param string $interval 比较类型 * @return Date */ public function dateAdd($number = 0, $interval = "d") { $hours = $this->hour; $minutes = $this->minute; $seconds = $this->second; $month = $this->month; $day = $this->day; $year = $this->year; switch ($interval) { case "yyyy": //---Add $number to year $year += $number; break; case "q": //---Add $number to quarter $month += ($number * 3); break; case "m": //---Add $number to month $month += $number; break; case "y": case "d": case "w": //---Add $number to day of year, day, day of week $day += $number; break; case "ww": //---Add $number to week $day += ($number * 7); break; case "h": //---Add $number to hours $hours += $number; break; case "n": //---Add $number to minutes $minutes += $number; break; case "s": //---Add $number to seconds $seconds += $number; break; } return (new Date(mktime($hours, $minutes, $seconds, $month, $day, $year))); } /** * 日期数字转中文 * 用于日和月、周 * @static * @access public * @param integer $number 日期数字 * @return string */ public function numberToCh($number) { $number = intval($number); $array = array('一', '二', '三', '四', '五', '六', '七', '八', '九', '十'); $str = ''; if ($number == 0) {$str .= "十";} if ($number < 10) { $str .= $array[$number - 1]; } elseif ($number < 20) { $str .= "十" . $array[$number - 11]; } elseif ($number < 30) { $str .= "二十" . $array[$number - 21]; } else { $str .= "三十" . $array[$number - 31]; } return $str; } /** * 年份数字转中文 * @static * @access public * @param integer $yearStr 年份数字 * @param boolean $flag 是否显示公元 * @return string */ public function yearToCh($yearStr, $flag = false) { $array = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九'); $str = $flag ? '公元' : ''; for ($i = 0; $i < 4; $i++) { $str .= $array[substr($yearStr, $i, 1)]; } return $str; } /** * 判断日期 所属 干支 生肖 星座 * type 参数:XZ 星座 GZ 干支 SX 生肖 * @static * @access public * @param string $type 获取信息类型 * @return string */ public function magicInfo($type) { $result = ''; $m = $this->month; $y = $this->year; $d = $this->day; switch ($type) { case 'XZ': //星座 $XZDict = array('摩羯', '宝瓶', '双鱼', '白羊', '金牛', '双子', '巨蟹', '狮子', '处女', '天秤', '天蝎', '射手'); $Zone = array(1222, 122, 222, 321, 421, 522, 622, 722, 822, 922, 1022, 1122, 1222); if ((100 * $m + $d) >= $Zone[0] || (100 * $m + $d) < $Zone[1]) { $i = 0; } else { for ($i = 1; $i < 12; $i++) { if ((100 * $m + $d) >= $Zone[$i] && (100 * $m + $d) < $Zone[$i + 1]) { break; } } } $result = $XZDict[$i] . '座'; break; case 'GZ': //干支 $GZDict = array( array('甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'), array('子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'), ); $i = $y - 1900 + 36; $result = $GZDict[0][$i % 10] . $GZDict[1][$i % 12]; break; case 'SX': //生肖 $SXDict = array('鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'); $result = $SXDict[($y - 4) % 12]; break; } return $result; } /** * 友好的时间显示 * @param int $sTime 待显示的时间 * @param string $type 类型. normal | mohu | full | ymd | other * @param string $alt 已失效 * @return string * */ public function friendlyDate($type = 'normal', $alt = 'false') { $sTime = $this->date; //sTime=源时间,cTime=当前时间,dTime=时间差 $cTime = time(); $dTime = $cTime - $sTime; $dDay = intval(date("z", $cTime)) - intval(date("z", $sTime)); //$dDay = intval($dTime/3600/24); $dYear = intval(date("Y", $cTime)) - intval(date("Y", $sTime)); //normal:n秒前,n分钟前,n小时前,日期 if ($type == 'normal') { if ($dTime < 60) { if ($dTime < 10) { return '刚刚'; } else { return intval(floor($dTime / 10) * 10) . "秒前"; } } elseif ($dTime < 3600) { return intval($dTime / 60) . "分钟前"; //今天的数据.年份相同.日期相同. } elseif ($dYear == 0 && $dDay == 0) { //return intval($dTime/3600)."小时前"; return '今天' . date('H:i', $sTime); } elseif ($dYear == 0) { return date("m月d日 H:i", $sTime); } else { return date("Y-m-d H:i", $sTime); } } elseif ($type == 'mohu') { if ($dTime < 60) { return $dTime . "秒前"; } elseif ($dTime < 3600) { return intval($dTime / 60) . "分钟前"; } elseif ($dTime >= 3600 && $dDay == 0) { return intval($dTime / 3600) . "小时前"; } elseif ($dDay > 0 && $dDay <= 7) { return intval($dDay) . "天前"; } elseif ($dDay > 7 && $dDay <= 30) { return intval($dDay / 7) . '周前'; } elseif ($dDay > 30) { return intval($dDay / 30) . '个月前'; } //full: Y-m-d , H:i:s } elseif ($type == 'full') { return date("Y-m-d , H:i:s", $sTime); } elseif ($type == 'ymd') { return date("Y-m-d", $sTime); } else { if ($dTime < 60) { return $dTime . "秒前"; } elseif ($dTime < 3600) { return intval($dTime / 60) . "分钟前"; } elseif ($dTime >= 3600 && $dDay == 0) { return intval($dTime / 3600) . "小时前"; } elseif ($dYear == 0) { return date("Y-m-d H:i:s", $sTime); } else { return date("Y-m-d H:i:s", $sTime); } } } /** * 判断是否日期时间 * @return string */ public static function checkDatetime($str_time, $format = "Y-m-d H:i:s") { $unix_time = strtotime($str_time); $check_date = date($format, $unix_time); if ($check_date == $str_time) { return true; } else { return false; } } public function __toString() { return $this->format(); } }