🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
<hr> ``` //当天时间 $where['time'] = array( array('egt',strtotime(date('Y-m-d',time()))), array('lt',strtotime(date('Y-m-d',time())).'+1 day') ); // 本周时间 $where['time'] = array( array('egt',strtotime(date('Y-m-d',time())).'-'.date('w',time()).' day'), array('lt',strtotime(date('Y-m-d',time())).'+1 week -'.date('w',time()).' day') ); // 本月时间 $where['time'] = array( array('egt',strtotime(date('Y-m',time()))), array('lt',strtotime(date('Y-m',time()).'+1 month')) ); // 本年时间 $where['time'] = array( array('egt',strtotime(date('Y',time()))), array('lt',strtotime(date('Y',time()).'+1 year')) ); //获取近一周时间 $date7 = date('Y-m-d', strtotime('-7 days')); $date1 = date('Y-m-d', strtotime('-1 days')); $where['time'] = array( array('egt',strtotime($date7)), array('lt',strtotime($date1)) ); ``` <hr> # php+mysql统计7天、30天每天数据没有补0 用PHP进行处理 $day为变量,这个日期我们可以定义,比如最近7天 $day为7就可以了,最近30天$day为30就可以了 ~~~php $day = 30 ;for ($i = $day - 1; 0 <= $i; $i--) {$result[] = date('m-d', strtotime('-' . $i . ' day'));$nums[] = 0;} ~~~ 这里我们构造最近30天数据,$day = 30 就会得到两个集合 $result 日期集合 $nums 日期对应数量集合 接下来利用array_walk进行循环,没有的补领 $scan_qushi 是我们运用最开始查询7天的那个数据查询方式查询出来近30天的数据(存在没有的) ~~~php array_walk($scan_qushi, function ($value, $key) use ($result, &$nums) {$index = array_search($value['datetime'],$result);$nums[$index] = $value['count'];});$data = ['day' => $result,'nums' => $nums]; ~~~ $result 日期 $nums 日期对应的数量,到此,我们完美的取出来了最近30天的数据。并且进行输出。 ~~~php $data = ['day' => $result,'nums' => $nums]; ~~~ 这样就可以交给echart工具进行数据展示了 <hr> # php+mysql获取7天、30天的统计数据,没有数值的补充0 ``` $order_list = db('orders') ->field('count(*) as count,date(FROM_UNIXTIME(ctime,"%Y%m%d")) as ctime,sum(total) as total') ->group("date_format(from_unixtime(ctime),'%Y%m%d')") ->where('DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(from_unixtime(ctime))') ->select(); //sql语句 //SELECT count(*) as count,date(FROM_UNIXTIME(ctime,"%Y%m%d")) as ctime,sum(total) as total FROM `qqxz_orders` WHERE ( DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(from_unixtime(ctime)) ) GROUP BY date_format(from_unixtime(ctime),'%Y%m%d') $order_list_arr = $order_list->toArray(); $day = 7; for ($i = $day - 1; 0 <= $i; $i--) { $result[] = date('Y-m-d', strtotime('-' . $i . ' day')); $nums[] = 0; $total[] = 0; } array_walk($order_list_arr, function ($value, $key) use ($result, &$nums,&$total) { $index = array_search($value['ctime'],$result); $nums[$index] = $value['count']; $total[$index] = $value['total']; }); $data = [ 'day' => $result, 'nums' => $nums, 'total' =>$total ]; halt($data); ``` <hr> php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(date('Y-m-d').'+'.$i.'day')); }; $date = $this->get_date($dateArray);//调用函数 第二步:日期和星期函数 /* * 返回输入日期数组对应的星期和日期 * @param $dateArray 需要的日期数组,如未来七天的日期 * */ function get_date($dateArray){ $b=array(); foreach($dateArray as $key=>$value){ $b[]=array('id'=>$key,'date'=>$value); }; foreach($b as $k=>$v){ $b[$k]['week']=$this->get_week($v['date']); $b[$k]['date']=$v['date']; } return $b; } /* * 返回输入日期星期几 * @param $date 日期 * */ function get_week($date){ $date_str=date('Y-m-d',strtotime($date)); $arr=explode("-", $date_str); $year=$arr[0]; $month=sprintf('%02d',$arr[1]); $day=sprintf('%02d',$arr[2]); $hour = $minute = $second = 0; $strap = mktime($hour,$minute,$second,$month,$day,$year); $number_wk=date("w",$strap); $weekArr=array("周日","周一","周二","周三","周四","周五","周六"); return $weekArr[$number_wk]; } <hr> # ThinkPHP5 (mySQL) 统计各个时间段内的订单量 背景 今天在进行后台数据监控时; 需要对一天24小时的下单量进行时间段的统计; 但是下单时间字段 pay_time 选取的是 timestamp 类型; 此时需要进行时间段的数据分组剥离,在此做一下实现方式,请多指教 … 环境 框架:ThinkPHP5.1.2 系统:nginx/win10 、phpStudy2017 1 2 实现方式 1. 首先,考虑到使用的是 group分组技巧; 那么就必须要将 pay_time 中记录的字段数据进行 24时的定位切分; 这里可以用到 substring() 方法的支持 【字段取值举例:2019-08-23 09:25:09】 2. 以我的 ThinkPHP5框架的代码规范 源码书写如下: ``` $res = Db::name('order_goods og') ->field("substring(pay_time,12,2) hour,count(og.id) count") ->join("order_infos oi","oi.order_id = og.order_id") ->where([ ["pay_status","=",1]]) ->group('hour') ->order('hour','asc') ->select(); // 即对应的原生sql语句为 SELECT substring(pay_time,12,2) hour,count(og.id) count FROM tp5_xorder_goods og INNER JOIN `tp5_xorder_infos` `oi` ON `oi`.`order_id`=`og`.`order_id` WHERE `pay_status` = 1 GROUP BY `hour` ORDER BY `hour` ASC ``` ##### 3\. 之后就是对得到的数据进一步的整理 * 以我使用`ECharts图表库`进行数据展示为例,那么我的处理方式如下: ``` $timeRes = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; foreach ($timeRes as $key => $value){ foreach ($res as $key2 => $value2){ $hour = intval($value2['hour']); if ($key == $hour){ $timeRes[$key] = $value2['count']; //echo "hour:".$hour.";key:".$key.";count:".$value2['count']."<br/>"; break; }else{ continue; } } } ``` <hr> # php (thinkPHP)计算连续登陆天数 ``` /** * 计算当月连续登陆天数 */ $smonthtime=strtotime(date("Y-m-01")); //当月第一天 $emonthtime=strtotime("+ 1 month",$smonthtime);//当月最后一天一天 $sdaytime=strtotime(date("Y-m-d",time()));//当天开始时间 $user = M('user')->field('logintime,lastlogintime,logindays')->where("id=3")->find(); if( $user['lastlogintime'] < $sdaytime ) { //如果是当天第一次登陆 $logindays = intval($user['logindays']); if ($user['lastlogintime'] > $smonthtime && $user['lastlogintime'] < $emonthtime) { //上次登陆在本月 $datetime1 = new \DateTime(date('Y-m-d', $user['lastlogintime'])); $datetime2 = new \DateTime(date('Y-m-d', $user['logintime'])); $interval = $datetime1->diff($datetime2);//和上次登陆相差天数 $diffday = $interval->format('%d'); if ($diffday == 1) { //如果相差1天,则为连续登陆 $logindays += 1; } else { //不是连续登陆,重置连续登陆天数为1 $logindays = 1; } } else { //上次登陆时间不是在本月,重置连续登陆天数为1 $logindays = 1; } } M('user')->where("id=3")->setField("logindays",$logindays); ``` <hr> ``` date_default_timezone_set('PRC'); //默认时区 //当前的时间增加5天 $date1 = "2014-11-11"; echo date('Y-m-d',strtotime("$date1 +5 day")); //输出结果:2014-11-16 //相应地,要增加月,年,将day改成month或year即可 //+++ 今天、昨天、明天 、上一周、下一周 +++++++++ echo "今天:",date("Y-m-d",time()),"<hr>"; echo "昨天:",date("Y-m-d",strtotime("-1 day")), "<hr>"; echo "明天:",date("Y-m-d",strtotime("+1 day")), "<hr>"; echo "一周后:",date("Y-m-d",strtotime("+1 week")), "<hr>"; echo "一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<hr>"; echo "下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<hr>"; echo "上个周一:".date("Y-m-d",strtotime("last Monday"))."<hr>"; echo "一个月前:".date("Y-m-d",strtotime("last month"))."<hr>"; echo "一个月后:".date("Y-m-d",strtotime("+1 month"))."<hr>"; echo "十年后:".date("Y-m-d",strtotime("+10 year"))."<hr>"; ``` <hr> 本文实例讲述了php获取本周星期一具体日期的方法。分享给大家供大家参考。具体如下: ``` private function mondayTime($timestamp=0,$is_return_timestamp=true){ static $cache ; $id = $timestamp.$is_return_timestamp; if(!isset($cache[$id])){ if(!$timestamp) $timestamp = time(); $monday_date = date('Y-m-d',$timestamp-86400*date('w',$timestamp)+(date('w',$timestamp)>0?86400:-/*6*86400*/518400)); if($is_return_timestamp){ $cache[$id] = strtotime($monday_date); }else{ $cache[$id] = $monday_date; } } return $cache[$id]; } echo $this->mondayTime(time() + 24*3600*2,false); exit; ``` 希望本文所述对大家的php程序设计有所帮助。 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网 <hr> 以下是几个获取时间接点的方法,先获取查询范围,再组织语句进行查询。 //php获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1; //php获取昨日起始时间戳和结束时间戳 $beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y')); $endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1; //php获取上周起始时间戳和结束时间戳 $beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y')); $endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y')); //php获取本月起始时间戳和结束时间戳 $beginThismonth=mktime(0,0,0,date('m'),1,date('Y')); $endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y')); PHP mktime() 函数用于返回一个日期的 Unix 时间戳。 语法 mktime(hour,minute,second,month,day,year,is_dst) 参数 描述 hour 可选。规定小时。 minute 可选。规定分钟。 second 可选。规定秒。 month 可选。规定用数字表示的月。 day 可选。规定天。 year 可选。规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。 is_dst 可选。如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。 使用一个between限制时间段在一个起始时间和终止时间之间,然后查询这个时间段的数据。 $map['time'] = array('BETWEEN',array($beginThismonth,$endThismonth)); $mrecharge = $User_recharge->where($map)->sum('recharge_num'); 注意:date()中'Y-m-d H:i:s'中的H大写代表24小时制,小写h代表12小时制。