| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 |
- <?php
- namespace Util;
- /**
- * 日期时间操作类
- */
- class Date
- {
- /**
- * 日期的时间戳
- * @var integer
- * @access protected
- */
- protected $date;
- /**
- * 时区
- * @var integer
- * @access protected
- */
- protected $timezone;
- /**
- * 年
- * @var integer
- * @access protected
- */
- protected $year;
- /**
- * 月
- * @var integer
- * @access protected
- */
- protected $month;
- /**
- * 日
- * @var integer
- * @access protected
- */
- protected $day;
- /**
- * 时
- * @var integer
- * @access protected
- */
- protected $hour;
- /**
- * 分
- * @var integer
- * @access protected
- */
- protected $minute;
- /**
- * 秒
- * @var integer
- * @access protected
- */
- protected $second;
- /**
- * 星期的数字表示
- * @var integer
- * @access protected
- */
- protected $weekday;
- /**
- * 星期的完整表示
- * @var string
- * @access protected
- */
- protected $cWeekday;
- /**
- * 一年中的天数 0-365
- * @var integer
- * @access protected
- */
- protected $yDay;
- /**
- * 月份的完整表示
- * @var string
- * @access protected
- */
- protected $cMonth;
- /**
- * 日期CDATE表示
- * @var string
- * @access protected
- */
- protected $CDATE;
- /**
- * 日期的YMD表示
- * @var string
- * @access protected
- */
- protected $YMD;
- /**
- * 时间的输出表示
- * @var string
- * @access protected
- */
- protected $CTIME;
- // 星期的输出
- protected $Week = array("日", "一", "二", "三", "四", "五", "六");
- /**
- * 架构函数
- * 创建一个Date对象
- * @param mixed $date 日期
- * @static
- * @access public
- */
- public function __construct($date = '')
- {
- //分析日期
- $this->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();
- }
- }
|