| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- <?php
- namespace common\helpers;
- use yii\db\Expression;
- /**
- * 日期
- *
- * @package Helper
- * @author Aries <forphp@qq.com>
- */
- class Date {
- const OCI_TIME_FORMAT_FULL = 'YYYY-MM-DD HH24:MI:SS';
- const OCI_TIME_FORMAT_DATE = 'YYYY-MM-DD';
- const OCI_TIME_FORMAT_MONTH = 'YYYY-MM';
- const OCI_TIME_FORMAT_YEAR = 'YYYY';
- const OCI_TIME_FORMAT_SHORT_DATE = 'YYYYMMDD';
- const OCI_TIME_FORMAT_SHORT_MONTH = 'YYYYMM';
- const OCI_DATE_FORMAT_PHP = 'Y-m-d';
- /**
- * 检测日期的格式
- * @param $value
- * @return bool
- */
- public static function validator($value) {
- if (!preg_match("#^\d{4}([/-])([0][0-9]|[1][0-2])\\1([0-2][0-9]|[3][0-1])$#", $value)) {
- return false;
- }
- return true;
- }
- /**
- * 获取当前时间,主要用于console里面获取当前时间,方便日后系统日期在这里面修改
- * @param int $days
- * @return int|mixed
- */
- public static function nowTime($days = 0) {
- $days = \Yii::$app->params['daysDiff'];
- if (\Yii::$app->id == 'app-console') {
- return time() + $days * 24 * 60 * 60;
- } else {
- return __SYSTEM_TIME__ + $days * 24 * 60 * 60;
- }
- }
- /**
- * 时间转换
- *
- * @param null $value
- * @param string $format
- * @return false|null|string
- */
- public static function convert($value = null, $format = 'Y-m-d') {
- if (is_null($value)) $value = date($format, self::nowTime()); //相对于某一时间的昨天
- //if (!self::validator($value)) $value = date($format, self::nowTime());
- if (Validator::validateQuickLy('chMonth', $value)) {
- return $value . '-01';
- }
- if (!Validator::validateQuickLy('chDate', $value)) {
- $value = date($format, $value);
- }
- return $value;
- }
- /**
- * 今天
- *
- * @param string $format
- * @return false|string
- */
- public static function today($format = 'Y-m-d') {
- return date($format, self::nowTime());
- }
- /**
- * 今天的开始时间
- *
- * @return false|int
- */
- public static function todayStart() {
- $relative = self::convert();
- return strtotime($relative);
- }
- /**
- * 今天的结束时间
- *
- * @return false|int
- */
- public static function todayEnd() {
- $relative = self::convert();
- return strtotime($relative . ' +1 day') - 1;
- }
- /**
- * 昨天
- *
- * @param null $relative
- * @param string $format
- * @return false|int|string
- */
- public static function yesterday($relative = null, $format = null) {
- $relative = self::convert($relative);
- $yestoday = strtotime($relative . '-1 day');
- if (!is_null($format)) {
- return date($format, $yestoday);
- }
- return $yestoday;
- }
- /**
- * 昨天的开始时间[0点]
- *
- * @param null $relative
- * @return false|int
- */
- public static function yesterdayStart($relative = null) {
- $date = self::yesterday($relative, 'Y-m-d');
- return strtotime($date);
- }
- /**
- * 昨天的结束时间[23:59:59]
- *
- * @param null $relative
- * @return false|int
- */
- public static function yesterdayEnd($relative = null) {
- $date = self::yesterday($relative, 'Y-m-d');
- return strtotime($date . ' +1 day') - 1;
- }
- /**
- * 上个月
- *
- * @param null $relative
- * @param string $format
- * @return false|int|string
- */
- public static function lastMonth($relative = null, $format = null) {
- $relative = self::convert($relative);
- $lastMonth = strtotime($relative . 'first day of previous month');
- if(!is_null($format)){
- return date($format ,$lastMonth);
- }
- return $lastMonth;
- }
- /**
- * 上几个月的时间
- * @param int $num
- * @param null $relative
- * @param null $format
- * @return false|int|string
- */
- public static function lastNumMonth($num = 1, $relative = null, $format = null) {
- $relative = self::convert($relative,'Y-m');
- $lastMonth = strtotime($relative . '-' . $num . ' month');
- if (!is_null($format)) {
- return date($format, $lastMonth);
- }
- return $lastMonth;
- }
- /**
- * 上几天的时间
- * @param int $num
- * @param null $relative
- * @param null $format
- * @return false|int|string
- */
- public static function lastNumDay($num = 1, $relative = null, $format = null) {
- $relative = self::convert($relative,'Y-m-d');
- $lastDay = strtotime($relative . '-' . $num . ' day');
- if (!is_null($format)) {
- return date($format, $lastDay);
- }
- return $lastDay;
- }
- /**
- * 下月
- * @param null $relative
- * @param null $format
- * @return false|int|string
- */
- public static function nextMonth($relative = null, $format = null) {
- $relative = self::convert($relative);
- $nextMonth = strtotime($relative . ' first day of next month');
- if(!is_null($format)){
- return date($format ,$nextMonth);
- }
- return $nextMonth;
- }
- /**
- * 下个月的指定日期
- * @param null $relative
- * @param null $format
- * @return false|int
- */
- public static function nextMonthDay($relative = null, $format = null) {
- $day = date('d', $relative);
- $nextMonthFirstDay = self::nextMonth($relative, $format = null);
- return strtotime(date('Y-m-'.$day, $nextMonthFirstDay));
- }
- /**
- * 一年的开始
- * @param null $relative
- * @return false|int
- */
- public static function yearStart($relative = null) {
- $relative = self::convert($relative, 'Y-01-01');
- return strtotime($relative);
- }
- /**
- * 一年的结束
- * @param null $relative
- * @return false|int
- */
- public static function yearEnd($relative = null) {
- $relative = self::convert($relative, 'Y-12-31');
- return strtotime($relative . ' +1 day') - 1;
- }
- /**
- * 月开始时间
- *
- * @param null $relative
- * @return false|int
- */
- public static function monthStart($relative = null) {
- $relative = self::convert($relative, 'Y-m-01');
- return strtotime($relative);
- }
- /**
- * 月结束时间[23:59:59]
- *
- * @param null $relative
- * @return false|int
- */
- public static function monthEnd($relative = null) {
- $firstday = self::convert($relative, 'Y-m-01');
- return strtotime($firstday . " +1 month") - 1;
- }
- /**
- * 某一天开始的时间 00:00:00
- *
- * @param null $relative
- * @return false|int
- */
- public static function dayStart($relative = null) {
- $day = self::convert($relative);
- return strtotime($day);
- }
- /**
- * 某一天开始的时间 23:59:59
- *
- * @param null $relative
- * @return false|int
- */
- public static function dayEnd($relative = null) {
- $day = self::convert($relative);
- return strtotime($day . ' +1 day') - 1;
- }
- /**
- * 一天中某个小时的时间戳
- * @param null $relative
- * @param $hour
- * @return false|int
- */
- public static function dayHour($relative = null, $hour = '00') {
- $day = self::convert($relative);
- $day = $day . " $hour:00:00";
- return strtotime($day);
- }
- /**
- * 一天中某小时某分钟的时间戳
- * @param null $relative
- * @param string $hourMinute
- * @return false|int
- */
- public static function dayMinute($relative = null, $hourMinute = '00:00') {
- $day = self::convert($relative);
- $day = $day . " $hourMinute:00";
- return strtotime($day);
- }
- /**
- * 本周的开始到结束
- *
- * @param null $relative
- * @return array
- */
- public static function thisWeek($relative = null) {
- if (is_null($relative)) {
- $relative = self::nowTime();
- } else if (Validator::validateQuickLy('chDate', $relative)) {
- $relative = strtotime($relative);
- }
- $startTime = strtotime('last Monday', $relative); //周一
- $endTime = strtotime('Sunday', $relative); //周日
- return [
- 'start' => self::dayStart($startTime),
- 'end' => self::dayEnd($endTime),
- ];
- }
- /**
- * 七天的数据
- *
- * @param string $format
- * @param null $relative
- * @return array
- */
- public static function sevenDays($format = 'Y-m-d', $relative = null) {
- $data = [];
- if (is_null($relative)) $relative = self::nowTime();
- if (Validator::validateQuickLy('chDate', $relative)) {
- $relative = strtotime($relative);
- }
- for ($i = 7; $i >= 0; $i--) {
- $time = strtotime("-$i day", $relative);
- $data[] = [
- 'date' => date($format, $time),
- 'time' => $time,
- 'shortDate' => date('m-d', $time),
- ];
- }
- $data[] = [
- 'date' => date($format, $relative),
- 'time' => $relative,
- 'shortDate' => date('m-d', $relative),
- ];
- return $data;
- }
- /**
- * 半年
- *
- * @param string $format
- * @param null $relative
- * @return array
- */
- public static function halfYear($format = 'Y-m-d', $relative = null) {
- $data = [];
- if (is_null($relative)) $relative = self::nowTime();
- if (Validator::validateQuickLy('chDate', $relative)) {
- $relative = strtotime($relative);
- }
- for ($i = 5; $i >= 0; $i--) {
- $time = strtotime("-$i month", $relative);
- $month = date('n', $time);
- $data[] = [
- 'date' => date($format, $time),
- 'time' => $time,
- 'month' => $month,
- ];
- }
- return $data;
- }
- /**
- * 日期间的差
- * @param $start
- * @param $end
- * @return \DateInterval|false
- */
- public static function diff($start, $end) {
- $start = Validator::validateQuickLy('chDate', $start) ? $start : date('Y-m-d', $start);
- $end = Validator::validateQuickLy('chDate', $end) ? $end : date('Y-m-d', $end);
- $sdate = date_create($start);
- $edate = date_create($end);
- $diff = date_diff($sdate, $edate);
- $result = [];
- $result['y'] = $diff->y + $diff->m / 12 + $diff->d / 365.25;
- $result['m'] = $diff->y * 12 + $diff->m + $diff->d / 30 + $diff->h / 24;
- $result['d'] = $diff->y * 365.25 + $diff->m * 30 + $diff->d + $diff->h / 24 + $diff->i / 60;
- $result['h'] = ($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h + $diff->i / 60;
- $result['i'] = (($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i + $diff->s / 60;
- $result['s'] = ((($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i) * 60 + $diff->s;
- return $result;
- }
- /**
- * 所传日期是周几
- * @param $relative
- * @return false|string
- */
- public static function dateWeek($relative = null) {
- $day = self::convert($relative);
- return date('w', strtotime($day));
- }
- /**
- * 是不是UNIXTIME
- * @param $time
- * @return bool
- */
- public static function isUnixtime($time) {
- $len = strlen($time);
- if ($len < 10) {
- return false;
- }
- if ($len > 10) {
- $time = substr($time, 0, 10);
- }
- return ctype_digit($time) && $time <= 2147483647;
- }
- /**
- * 获取Oracle支持的to_date的时间格式
- * @param null $dateTime
- * @param string $format
- * @return Expression
- */
- public static function ociToDate($dateTime = null, $format = self::OCI_TIME_FORMAT_FULL) {
- if ($dateTime === null) {
- $dateTime = self::nowTime();
- }
- // if (self::isUnixtime($dateTime)) {
- // $dateTime = date('Y-m-d H:i:s', $dateTime);
- // }
- //
- // return new Expression("TO_DATE('$dateTime', '$format')");
- if (!self::isUnixtime($dateTime)) {
- $dateTime = strtotime($dateTime);
- }
- return date('Y-m-d', $dateTime);
- }
- /**
- * UTC时间转时间戳
- * @param $dateTime
- * @return false|int
- */
- public static function utcToTime($dateTime) {
- return strtotime($dateTime);
- }
- /**
- * 是否是正确的年月格式
- * @param $yearMonth
- * @return false|int
- */
- public static function isYearMonth($yearMonth) {
- return preg_match('/^\d{4}[0-1]\d$/', $yearMonth);
- }
- /**
- * 当前年份
- * @return false|string
- */
- public static function nowYear() {
- return date('Y', self::nowTime());
- }
- /**
- * 当月
- * @return false|string
- */
- public static function nowYearMonth() {
- return date('Ym', self::nowTime());
- }
- /**
- * 获取日期区间的值
- * @param array $params
- * @return array|bool
- */
- public static function getDateRange($params = []){
- $default = [
- 'startKey'=>'startDate',
- 'endKey'=>'endDate',
- 'value'=>null,
- ];
- $params = Tool::deepParse($params ,$default);
- if(!is_null($params['value'])){
- list($startDate, $endDate) = $params['value'];
- }else{
- $startDate = \Yii::$app->request->all($params['startKey']);
- $endDate = \Yii::$app->request->all($params['endKey']);
- $startDate = urldecode($startDate);
- $endDate = urldecode($endDate);
- }
- $startTime = strtotime($startDate);
- $endTime = strtotime($endDate);
- if(!$startTime || !$endTime){
- return false;
- }
- $monthStart = self::monthStart($startTime);
- return [
- 'startDate'=>$startDate,
- 'endDate'=>$endDate,
- 'startTime'=>$startTime,
- 'monthStart'=>$monthStart,
- 'monthStartDate'=>date(self::OCI_DATE_FORMAT_PHP, $monthStart),
- 'endTime'=>strtotime($endDate.'+1 day') - 1, //获取$endDate的23:59:59
- ];
- }
- }
|