请选择 进入手机版 | 继续访问电脑版

Yii2|Yii爱好者中文社区门户

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: yii 控制器 数组
查看: 711|回复: 3

PHP计算两个时间差的信息描述

  [复制链接]

5

主题

27

帖子

297

积分

中级会员

Rank: 3Rank: 3

积分
297
发表于 2015-12-30 08:36:01 | 显示全部楼层 |阅读模式
本帖最后由 zhgxun 于 2016-1-6 15:07 编辑

在项目中,有时候可能会遇到这样的情况,发布一个投票,新增一个任务。。。需要显示当前时间离任务,投票结束还有多少时间。原理虽然简单,但是这种计算相当繁琐。
  1. public function actionB($start, $end)
  2.     {
  3.         $start = strtotime($start . ' 00:00:01');
  4.         $end = strtotime($end . ' 23:59:59');
  5.         echo $this->timeDescription($start, $end, true) . PHP_EOL;
  6.     }

  7.     /**
  8.      * 获取剩余时间描述
  9.      * @param int $startTime 开始时间戳
  10.      * @param int $endTime 结束时间戳
  11.      * @param bool|false $isLong 是否返回长格式描述, 例如4天7小时34分钟16秒, 默认返回最大类型时间描述, 例如4天
  12.      * @return mixed|string
  13.      */
  14.     public function timeDescription($startTime, $endTime, $isLong = false)
  15.     {
  16.         if ($endTime < $startTime) {
  17.             return '错误的时间格式';
  18.         }
  19.         $now = time();
  20.         $tips = '已结束';
  21.         if ($endTime <= $now) {
  22.             return $tips;
  23.         }
  24.         if ($startTime >= $now) {
  25.             return '未开始';
  26.         }
  27.         $time = [];
  28.         $diff = $endTime - $now;
  29.         $days = floor($diff / 86400);
  30.         // 天数累计时间戳
  31.         $daysTime = 0;
  32.         if ($days) {
  33.             $time[1] = $days . '天';
  34.             $daysTime = $days * 86400;
  35.         }
  36.         $hours = floor(($diff - $daysTime) / 3600);
  37.         // 小时数累计时间戳
  38.         $hoursTime = 0;
  39.         if ($hours) {
  40.             $time[2] = $hours . '小时';
  41.             $hoursTime = $hours * 3600;
  42.         }
  43.         $minutes = floor(($diff - ($daysTime + $hoursTime)) / 60);
  44.         // 分钟数累计时间戳
  45.         $minutesTime = 0;
  46.         if ($minutes) {
  47.             $time[3] = $minutes . '分钟';
  48.             $minutesTime = $minutes * 60;
  49.         }
  50.         $seconds = floor($diff - ($daysTime + $hoursTime + $minutesTime));
  51.         if ($seconds) {
  52.             $time[4] = $seconds . '秒';
  53.         }
  54.         if (!$time) {
  55.             return $tips;
  56.         }
  57.         ksort($time);
  58.         if ($isLong) {
  59.             return implode('', $time);
  60.         }
  61.         return array_shift($time);
  62.     }
复制代码

    效果类似:
   

    类似的一个函数,我还不知道php有现成的时间差计算扩展,遗憾将返回的字符串拼接成易读方式这么麻烦,有好方法的兄弟,可以跟帖支持下。

  1.     public function time($startTime, $endTime, $isLong = true)
  2.     {
  3.         if ($endTime < $startTime) {
  4.             return false;
  5.         }
  6.         $now = time();
  7.         if ($endTime <= $now) {
  8.             return '已结束';
  9.         }
  10.         if ($startTime >= $now) {
  11.             return '未开始';
  12.         }
  13.         $timeTips = [0 => '年', 1 => '月', 2 => '日', 3 => '时', 4 => '分', 5 => '秒'];
  14.         $times = [];
  15.         $start = date_create($startTime);
  16.         $end = date_create($endTime);
  17.         $interval = date_diff($start, $end);
  18.         $timeString = $interval->format('%y,%m,%d,%h,%i,%s');
  19.         $diff = explode(',', $timeString);
  20.         foreach ($diff as $tip => $time) {
  21.             if (!$time || !isset($timeTips[$tip])) {
  22.                 continue;
  23.             }
  24.             $times[$tip] = $time . $timeTips[$tip];
  25.         }
  26.         if (!$times) {
  27.             return false;
  28.         }
  29.         ksort($times);
  30.         if ($isLong) {
  31.             return implode('', $times);
  32.         }
  33.         return array_shift($times);
  34.     }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

海!外直播 t.cn/RxlBL8F 禁闻视频 t.cn/RxrADky 一个国家有三千所普通大学,学生大多自费;但却有6000所党校是花纳税人的钱办学,学生全都用纳税人的钱上学!令人发指的是它们的毕业生犯罪率几乎百分之百!  发表于 2017-6-13 05:56
回复

使用道具 举报

5

主题

27

帖子

297

积分

中级会员

Rank: 3Rank: 3

积分
297
 楼主| 发表于 2015-12-30 08:42:30 | 显示全部楼层
51行那个floor()其实不需要,重复了,因为本来就只有整数的秒数。
回复 支持 反对

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46528
发表于 2015-12-30 11:05:04 | 显示全部楼层
收藏一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|Yii2|Yii爱好者中文社区门户  

GMT+8, 2017-6-29 15:17 , Processed in 0.315133 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表