背景

工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率

主要功能

根据相差的天数获取连续的时间段


/**
* 根据相差的天数获取所有连续的时间段
* @param $diffDay
* @param string $dateFormat
* @return array
*/
public static function getContinuesDayDiffDay($diffDay, $dateFormat = 'Y-m-d') {
$today = date('Y-m-d');
$timeLabel = [];
for ($i=1;$i<=$diffDay;$i++){
$diff = $diffDay - $i;
$mday = date($dateFormat,strtotime("$today -$diff day"));
array_push($timeLabel,$mday);
}
//转化查询条件
$year = date('Y');
$startDay = str_replace('.','-',$timeLabel[0]);
$endDay = str_replace('.','-',$timeLabel[$diffDay-1]);
$startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
return [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
}

根据两个日期获取连续的时间段


/**
* 根据开始和结束时间获取所有连续的时间段
* @param string $startDay 开始日期 格式:Y-m-d
* @param string $endDay 开始日期 格式:Y-m-d
* @param string $dateFormat
* @return array
*/
public static function getContinuesDayByRange($startDay, $endDay, $dateFormat = 'Y-m-d') {
$timeLabel = [];
if(strtotime($startDay) > strtotime($endDay)){
$tmp = $startDay;
$endDay = $tmp;
$startDay = $endDay;
}
if($startDay == $endDay){
array_push($timeLabel,$startDay); $startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
$timeLabel = [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
return $timeLabel;
} $targetDay = $startDay;
while ($targetDay != $endDay){
array_push($timeLabel,$targetDay);
$targetDay = date($dateFormat,strtotime("$targetDay +1 day"));
} array_push($timeLabel,$endDay); //增加
$startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
$timeLabel = [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
return $timeLabel;
}

根据日期获取当月的开始时间和结束时间


/**
* 根据日期获取本月的开始时间和结束时间
* @param $date Y-m 2017-10
* @return array
*/
public static function getMonthDaysByDate($date) {
$data = [];
$timestamp = strtotime( $date );
$data['start_time'] = date( 'Y-m-01 00:00:00', $timestamp );
$mdays = date( 't', $timestamp );
$data['end_time'] = date( 'Y-m-' . $mdays . ' 23:59:59', $timestamp );
return $data;
}

时间友好格式化风格


/**
* 时间友好型提示风格化(即微博中的XXX小时前、昨天等等)
* 即微博中的 XXX 小时前、昨天等等, 时间超过 $time_limit 后返回按 out_format 的设定风格化时间戳
* @param int
* @param int
* @param string
* @param array
* @param int
* @return string
*/
public static function getFriendlyTime($timestamp, $timeLimit = 604800, $out_format = 'Y/m/d', $formats = null, $now = null){
/*if (get_setting('time_style') == 'N')
{
return date($out_format, $timestamp);
}*/ if (!$timestamp)
{
return false;
} if ($formats == null)
{
$formats = [
'YEAR' =>'%s 年前',
'MONTH' => '%s 月前',
'DAY' => '%s 天前',
'HOUR' => '%s 小时前',
'MINUTE' => '%s 分钟前',
'SECOND' => '%s 秒前'
];
} $now = $now == null ? time() : $now;
$seconds = $now - $timestamp; if ($seconds == 0)
{
$seconds = 1;
} if (!$timeLimit OR $seconds > $timeLimit)
{
return date($out_format, $timestamp);
} $minutes = floor($seconds / 60);
$hours = floor($minutes / 60);
$days = floor($hours / 24);
$months = floor($days / 30);
$years = floor($months / 12); if ($years > 0)
{
$diffFormat = 'YEAR';
}
else
{
if ($months > 0)
{
$diffFormat = 'MONTH';
}
else
{
if ($days > 0)
{
$diffFormat = 'DAY';
}
else
{
if ($hours > 0)
{
$diffFormat = 'HOUR';
}
else
{
$diffFormat = ($minutes > 0) ? 'MINUTE' : 'SECOND';
}
}
}
} $dateDiff = null; switch ($diffFormat)
{
case 'YEAR' :
$dateDiff = sprintf($formats[$diffFormat], $years);
break;
case 'MONTH' :
$dateDiff = sprintf($formats[$diffFormat], $months);
break;
case 'DAY' :
$dateDiff = sprintf($formats[$diffFormat], $days);
break;
case 'HOUR' :
$dateDiff = sprintf($formats[$diffFormat], $hours);
break;
case 'MINUTE' :
$dateDiff = sprintf($formats[$diffFormat], $minutes);
break;
case 'SECOND' :
$dateDiff = sprintf($formats[$diffFormat], $seconds);
break;
} return $dateDiff;
}

根据日期获取是星期几


/**
* 获取星期几
* @param $date
* @return
*/
public static function getWeekDay($date) {
//强制转换日期格式
$dateStr=date('Y-m-d',strtotime($date));
//封装成数组
$arr=explode("-", $dateStr);
//参数赋值
//年
$year=$arr[0]; //月,输出2位整型,不够2位右对齐
$month=sprintf('%02d',$arr[1]);
//日,输出2位整型,不够2位右对齐
$day=sprintf('%02d',$arr[2]); //时分秒默认赋值为0;
$hour = $minute = $second = 0; //转换成时间戳
$strap = mktime($hour,$minute,$second,$month,$day,$year); //获取数字型星期几
$numberWk=date("w",$strap); //自定义星期数组
$weekArr=array(7,1,2,3,4,5,6); //获取数字对应的星期
return $weekArr[$numberWk];
}

获取指定日期前后相同时间天数的时间范围


/**
* 获取指定日期前后相同时间天数的范围时间
* @param int $dayDiff
* @param string $day
* @param string $dateFormat
* @return array
*/
public static function getPointDaySameRangeContinuesTime($dayDiff = 0,$day = "", $dateFormat = "Y-m-d") {
$day = $day?$day:date($dateFormat);
$startTime = date($dateFormat,strtotime("$day -$dayDiff day"));
$endTime = date($dateFormat,strtotime("$day +$dayDiff day"));
$result = self::getContinuesDayByRange($startTime,$endTime,$dateFormat = 'Y-m-d');
return $result;
}

获取两个日期之间相差的天数


/**
* 获取两个日期之间相差的天数
* @param string $day1 第一个日期,格式为Y-m-d
* @param string $day2 第二个日期,格式为Y-m-d
* @return integer
*/
public static function getDiffBetweenTwoDays($day1, $day2) {
$second1 = strtotime($day1);
$second2 = strtotime($day2);
if ($second1 < $second2) {
$tmp = $second2;
$second2 = $second1;
$second1 = $tmp;
}
return ($second1 - $second2) / 86400;
}

根据指定日期和天数,获取结束的日期


/**
* 根据日期和相差的天数获取结束的天数
* @param $day
* @param $diffDay
* @param bool $isBefore
* @return false|string
*/
public static function getEndDayByDayAndDiff($day, $diffDay, $isBefore = false) {
$operator = $isBefore ? "-" : "+";
$endDay = date('Y-m-d',strtotime("$day $operator $diffDay day"));
return $endDay;
}

判断两个日期是否为同一天


/**
* 判断两个时间是否同一天
* @param string $date1 Y-m-d
* @param string $date2 Y-m-d
* @return bool
*/
public static function isSameDay($date1, $date2) {
$day1 = self::dateTime(strtotime($date1)) ;
$day2 = self::dateTime(strtotime($date2));
return $day1 == $day2;
}

转换秒钟为分钟


/**
* 转换秒钟为分钟
* @param $seconds
* @return string
*/
public static function convertSecondToTime($seconds) {
$reminded = strval($seconds % 60);
$minute = strval(($seconds - $reminded) / 60);
if(strlen($minute)<2){
$minute = '0'.$minute;
}
if(strlen($reminded)<2){
$reminded = '0'.$reminded;
}
$time = $minute.":".$reminded;
return $time;
}

获取毫秒数


/**
* 获取时间的毫秒数
* @return float
*/
public static function millisecond() {
list($msec, $sec) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}

附录:完整的时间帮助类代码


<?php
/**
* Created by PhpStorm.
* User: Auser
* Date: 2017/7/16
* Time: 20:47
*/ namespace App\Http\Helper; use Illuminate\Support\Facades\Input;
use Intervention\Image\Facades\Image;
use Mockery\Exception; class TimeHelper
{
/**
* 根据相差的天数获取所有连续的时间段
* @param $diffDay
* @param string $dateFormat
* @return array
*/
public static function getContinuesDayDiffDay($diffDay, $dateFormat = 'Y-m-d') {
$today = date('Y-m-d');
$timeLabel = [];
for ($i=1;$i<=$diffDay;$i++){
$diff = $diffDay - $i;
$mday = date($dateFormat,strtotime("$today -$diff day"));
array_push($timeLabel,$mday);
}
//转化查询条件
$year = date('Y');
$startDay = str_replace('.','-',$timeLabel[0]);
$endDay = str_replace('.','-',$timeLabel[$diffDay-1]);
$startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
return [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
} /**
* 根据开始和结束时间获取所有连续的时间段
* @param string $startDay 开始日期 格式:Y-m-d
* @param string $endDay 开始日期 格式:Y-m-d
* @param string $dateFormat
* @return array
*/
public static function getContinuesDayByRange($startDay, $endDay, $dateFormat = 'Y-m-d') {
$timeLabel = [];
if(strtotime($startDay) > strtotime($endDay)){
$tmp = $startDay;
$endDay = $tmp;
$startDay = $endDay;
}
if($startDay == $endDay){
array_push($timeLabel,$startDay); $startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
$timeLabel = [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
return $timeLabel;
} $targetDay = $startDay;
while ($targetDay != $endDay){
array_push($timeLabel,$targetDay);
$targetDay = date($dateFormat,strtotime("$targetDay +1 day"));
} array_push($timeLabel,$endDay); //增加
$startTime = strtotime($startDay." 00:00:00");
$endTime = strtotime($endDay." 23:59:59");
$timeLabel = [
'start_time' => $startTime,
'end_time' => $endTime,
'time_label' => $timeLabel,
];
return $timeLabel;
} /**
* 根据日期获取本月的开始时间和结束时间
* @param $date Y-m 2017-10
* @return array
*/
public static function getMonthDaysByDate($date) {
$data = [];
$timestamp = strtotime( $date );
$data['start_time'] = date( 'Y-m-01 00:00:00', $timestamp );
$mdays = date( 't', $timestamp );
$data['end_time'] = date( 'Y-m-' . $mdays . ' 23:59:59', $timestamp );
return $data;
} /**
* 获取两个月份之间连续的月份
* @param $start
* @param $end
* @return array
*/
public static function prDates($start, $end) { // 两个日期之间的所有日期
$time_start = strtotime($start); // 自动为00:00:00 时分秒 两个时间之间的年和月份
$time_end = strtotime($end);
$monarr[] = $start; // 当前月;
while( ($time_start = strtotime('+1 month', $time_start)) <= $time_end){
array_push($monarr,date('Y-m', $time_start));// 取得递增月
}
return $monarr;
} /**
* 时间友好型提示风格化(即微博中的XXX小时前、昨天等等)
* 即微博中的 XXX 小时前、昨天等等, 时间超过 $time_limit 后返回按 out_format 的设定风格化时间戳
* @param int
* @param int
* @param string
* @param array
* @param int
* @return string
*/
public static function getFriendlyTime($timestamp, $timeLimit = 604800, $out_format = 'Y/m/d', $formats = null, $now = null){
/*if (get_setting('time_style') == 'N')
{
return date($out_format, $timestamp);
}*/ if (!$timestamp)
{
return false;
} if ($formats == null)
{
$formats = [
'YEAR' =>'%s 年前',
'MONTH' => '%s 月前',
'DAY' => '%s 天前',
'HOUR' => '%s 小时前',
'MINUTE' => '%s 分钟前',
'SECOND' => '%s 秒前'
];
} $now = $now == null ? time() : $now;
$seconds = $now - $timestamp; if ($seconds == 0)
{
$seconds = 1;
} if (!$timeLimit OR $seconds > $timeLimit)
{
return date($out_format, $timestamp);
} $minutes = floor($seconds / 60);
$hours = floor($minutes / 60);
$days = floor($hours / 24);
$months = floor($days / 30);
$years = floor($months / 12); if ($years > 0)
{
$diffFormat = 'YEAR';
}
else
{
if ($months > 0)
{
$diffFormat = 'MONTH';
}
else
{
if ($days > 0)
{
$diffFormat = 'DAY';
}
else
{
if ($hours > 0)
{
$diffFormat = 'HOUR';
}
else
{
$diffFormat = ($minutes > 0) ? 'MINUTE' : 'SECOND';
}
}
}
} $dateDiff = null; switch ($diffFormat)
{
case 'YEAR' :
$dateDiff = sprintf($formats[$diffFormat], $years);
break;
case 'MONTH' :
$dateDiff = sprintf($formats[$diffFormat], $months);
break;
case 'DAY' :
$dateDiff = sprintf($formats[$diffFormat], $days);
break;
case 'HOUR' :
$dateDiff = sprintf($formats[$diffFormat], $hours);
break;
case 'MINUTE' :
$dateDiff = sprintf($formats[$diffFormat], $minutes);
break;
case 'SECOND' :
$dateDiff = sprintf($formats[$diffFormat], $seconds);
break;
} return $dateDiff;
} /**
* 获取星期几
* @param $date
* @return
*/
public static function getWeekDay($date) {
//强制转换日期格式
$dateStr=date('Y-m-d',strtotime($date));
//封装成数组
$arr=explode("-", $dateStr);
//参数赋值
//年
$year=$arr[0]; //月,输出2位整型,不够2位右对齐
$month=sprintf('%02d',$arr[1]);
//日,输出2位整型,不够2位右对齐
$day=sprintf('%02d',$arr[2]); //时分秒默认赋值为0;
$hour = $minute = $second = 0; //转换成时间戳
$strap = mktime($hour,$minute,$second,$month,$day,$year); //获取数字型星期几
$numberWk=date("w",$strap); //自定义星期数组
$weekArr=array(7,1,2,3,4,5,6); //获取数字对应的星期
return $weekArr[$numberWk];
} /**
* 获取指定日期前后相同时间天数的范围时间
* @param int $dayDiff
* @param string $day
* @param string $dateFormat
* @return array
*/
public static function getPointDaySameRangeContinuesTime($dayDiff = 0,$day = "", $dateFormat = "Y-m-d") {
$day = $day?$day:date($dateFormat);
$startTime = date($dateFormat,strtotime("$day -$dayDiff day"));
$endTime = date($dateFormat,strtotime("$day +$dayDiff day"));
$result = self::getContinuesDayByRange($startTime,$endTime,$dateFormat = 'Y-m-d');
return $result;
} /**
* 获取两个日期之间相差的天数
* @param string $day1 第一个日期,格式为Y-m-d
* @param string $day2 第二个日期,格式为Y-m-d
* @return integer
*/
public static function getDiffBetweenTwoDays($day1, $day2) {
$second1 = strtotime($day1);
$second2 = strtotime($day2);
if ($second1 < $second2) {
$tmp = $second2;
$second2 = $second1;
$second1 = $tmp;
}
return ($second1 - $second2) / 86400;
} /**
* 根据日期和相差的天数获取结束的天数
* @param $day
* @param $diffDay
* @param bool $isBefore
* @return false|string
*/
public static function getEndDayByDayAndDiff($day, $diffDay, $isBefore = false) {
$operator = $isBefore ? "-" : "+";
$endDay = date('Y-m-d',strtotime("$day $operator $diffDay day"));
return $endDay;
} /**
* 根据时间戳返回日期型时间戳
* @param $time
* @return int
*/
public static function dateTime($time) {
return strtotime(date('Y-m-d', $time));
} /**
* @param $num
* @return string
*/
public static function getFriendlyNumber($num) {
if ($num >= 10000) {
$num = round($num / 10000 ,1) .'万';
} else {
$num = $num;
}
return $num;
} /**
* 判断两个时间是否同一天
* @param string $date1 Y-m-d
* @param string $date2 Y-m-d
* @return bool
*/
public static function isSameDay($date1, $date2) {
$day1 = self::dateTime(strtotime($date1)) ;
$day2 = self::dateTime(strtotime($date2));
return $day1 == $day2;
} /**
* 转换秒钟为分钟
* @param $seconds
* @return string
*/
public static function convertSecondToTime($seconds) {
$reminded = strval($seconds % 60);
$minute = strval(($seconds - $reminded) / 60);
if(strlen($minute)<2){
$minute = '0'.$minute;
}
if(strlen($reminded)<2){
$reminded = '0'.$reminded;
}
$time = $minute.":".$reminded;
return $time;
} /**
* 获取时间的毫秒数
* @return float
*/
public static function millisecond() {
list($msec, $sec) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}
}

来源:https://segmentfault.com/a/1190000017512325

最新文章

  1. Linux的3个文件时间
  2. R正则表达式的问题
  3. SQL server 表中如何创建索引?
  4. [转自开心软件园]解读“剩余 Windows 重置计数”和“信任时间”
  5. 循环,range,continue 和 break
  6. 利用doScroll在IE浏览器里模仿DOMContentLoaded
  7. SQLite使用教程9 Select 语句
  8. 【重要版本】Firefly alpha beta v1.2.2 正式发布
  9. Oracle的commit详解(转)
  10. CentOS 6.4 安装思维到图工具TheBrain
  11. 多线程之线程池Executor应用
  12. hdu 3436 线段树 一顿操作
  13. Linux input子系统分析
  14. 在ASP.NET Core中给上传图片功能添加水印
  15. mac 配置jdk,maven环境变量
  16. Oracle KEEP 分析函数
  17. spak数据倾斜解决方案
  18. 城市联动 - 自动生成SQL语句
  19. Unable to install SQL Server (setup.exe), VS Shell installation has failed with exit code 1638.
  20. Java面向对象 第3节 类的封装和继承

热门文章

  1. SpringBoot系列之——整合JPA、mysql
  2. 启动和停止GlassFish Server
  3. mysql-增删改(DML)
  4. poj 2486 树形DP n选m连续路径
  5. intellijidea课程 intellijidea神器使用技巧 3-2 livetemplate
  6. 创建Podspec 并且发布到github spec
  7. Asp.net防御XSS攻击组件库
  8. 如何用C# 动态创建Access数据库和表?
  9. 笨办法学Python(二十)
  10. 4 - 函数&装饰器 and 迭代器&生成器