PHP获取今天,昨天,本周,本月,季度,年份等特殊时间戳方法整理

问题描述

时间在我们日常的代码编写中会是经常出现的筛选或排序条件,尤其是一些特殊时间节点的时间显得尤为突出,例如昨天,当前日期,当前月份,当前季度,以及当前年份的开始以及结束的时间戳,今天对部分相对简便的方法进行了部分整理。

解决方案

话不多说,稍微进行分类,贴代码。

获取当前时间戳与日期格式时间

 time()   //获取当前十位时间戳

 msectime() //获取当前十三位时间戳

 date('Y-m-d h:m:s') //获取当前日期格式时间

今天时间戳与日期

时间戳

当前天的时间戳直接使用当前时间格式,指定起始以及结束时间来实现快速拿到时间戳的效果。

 $startTime = strtotime(date('Y-m-d').'00:00:00');

 $overTime = strtotime(date('Y-m-d').'23:59:59');

日期格式

相应的,咱们可以直接字符串拼接实现日期格式的显示。

//弱类型语言,直接拼接字符串

 $startDate=date('Y-m-d').' 00:00:00';

 $overDate=date('Y-m-d').' 00:00:00';

昨天时间戳与日期

时间戳

 $startTime = mktime(0,date('m'),date('d')-1,date('Y'));

 $overTime = mktime(0,date('d'),date('Y'))-1;

日期格式

方法一: 根据时间戳转日期格式

//根据上面的时间戳进行格式转换

 $startDate=date("Y-m-d H:i:s",$startTime);

 $overDate =date("Y-m-d H:i:s",$overTime);

新想法:根据首先获取当前天日期,然后使用date函数进行时间格式转换。

//获取当前日期的天数的数值减一之后就是昨天啦

 $time=date('d')-1;

 $startDate=date("Y-m-".$time." 00:00:00",time());

 $overDate=date("Y-m-".$time." 23:59:59",time());

但是在月初时会出现日期为0的异常,除了进行判断,不知道有没有其他简便的方法可以解决,不然还是时间戳转日期格式比较简便,希望有简单解决办法的大佬给点新想法。

本周时间戳与日期

时间戳

date( )函数中 date(‘w’) 可以获取今天是本周第几天,通过简单处理就可以得到本周的起始以及结束时间。

这种思路和方法可以推广到上周的起始和结束时间。

方法一:

//本周开始时间戳

$startTime = mktime(0,date('d')-date('w')+1,date('y'));

//本周结束时间戳

$overTime = mktime(23,59,date('d')-date('w')+7,date('y'));

方法二:

 $nowDate = date("Y-m-d");

 $week = date('w',strtotime($nowDate));

 $startTime = strtotime("$nowDate -".($week ? $week - 1 : 6).' days');//本周第一天

 $overTime = $start_time + 86400*7 -1; //本周最后一天

日期格式

使用日期格式函数转换时间戳,也可以用上面的方法进行date()函数中格式,进行转换。

//本周开始时间戳

$startTime = date("Y-m-d H:i:s",mktime(0,date('y')));

//本周结束时间戳

$overTime = date("Y-m-d H:i:s",mktime(23,date('y')));

本月时间戳和日期

时间戳

//本月起始时间时间戳

$startTime =mktime(0,1,date('Y'));  

//本月结束时间时间戳

$overTime =mktime(23,date('t'),date('Y')); 

日期格式

使用date( )函数进行时间戳转换日期格式。

//本月起始时间日期格式

$startTime = date("Y-m-d H:i:s",date('Y')));  

//本月结束时间日期格式

$overTime = date("Y-m-d H:i:s",date('Y'))); 

本季度时间戳和日期

时间戳

 //获取当前季度

$season = ceil((date('m'))/3);

 //当前季度开始时间戳时间戳

$startTime = mktime(00,00,$season*2+1,date('Y'));

 //获取当前季度结束时间戳

$overTime = mktime(23,$season*3,date('t',date("Y"))),date('Y'));

日期格式

把上面的时间戳转换为日期格式

date("Y-m-d",$startTime)

date("Y-m-d",$overTime)

当前年时间戳和日期

时间戳

//本年开始  

$startTime  = strtotime(date("Y",time())."-1"."-1"); 

//本年结束

$overTime  = strtotime(date("Y",time())."-12"."-31");  

日期格式

//本年开始  

$startTime  = date("Y-m-d H:i:s",strtotime(date("Y",time())."-1"."-1"));

//本年结束

$overTime  =  date("Y-m-d H:i:s",time())."-12"."-31"));  

strtotime函数获取描述对应时间

明天当前时间

strtotime("+1 day")//时间戳

date("Y-m-d H:i:s",strtotime("+1 day"))//日期格式

明天当前时间

strtotime("+1 day")//时间戳

date("Y-m-d H:i:s",strtotime("+1 day"))//日期格式

昨天当前时间

strtotime("-1 day")//时间戳

date("Y-m-d H:i:s",strtotime("-1 day"))//日期格式

下个星期当前时间

strtotime("+1 week")//时间戳

date("Y-m-d H:i:s",strtotime("+1 week"))//日期格式

上个星期当前时间

strtotime("-1 week")//时间戳

date("Y-m-d H:i:s",strtotime("-1 week"))//日期格式

下星期几当前时间

strtotime("next Thursday")//时间戳

date("Y-m-d H:i:s",strtotime("next Thursday"))//日期格式

上星期几当前时间

strtotime("last Thursday")//时间戳

date("Y-m-d H:i:s",strtotime("last Thursday"))//日期格式

时间戳转日期格式

$timestamp =1664170375;//当前时间戳

date("Y-m-d H:i:s",$timestamp);//转换为日期格式

日期格式转时间戳

$time = '2022-09-26 23:31:59';//时间格式参数

strtotime($time);//转换为时间戳

获取特定时间戳函数

/**特定时间戳函数

 * @param $targetTime

 */

function gettimestamp($targetTime){

    switch ($targetTime){

        case 'today'://今天

            $timeamp['start'] = strtotime(date('Y-m-d'));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('+1 day')));

            break;

        case 'yesterday'://昨天

            $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-1 day')));

            $timeamp['over'] = strtotime(date('Y-m-d'));

            break;

        case 'beforyesterday'://前天

            $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-2 day')));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('-1 day')));

            break;

        case 'beforweek'://本周

            $timeamp['start'] = strtotime(date("Y-m-d H:i:s",date("m"),date("d")-date("w")+1,date("Y"))));

            $timeamp['over'] = strtotime(date("Y-m-d H:i:s",date("d")-date("w")+7,date("Y"))));

            break;

        case 'nowmonth'://本月

            $timeamp['start'] = strtotime(date('Y-m-01'));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('+1 day')));

            break;

        case 'permonth'://上月

            $timeamp['start'] = strtotime(date('Y-m-01',strtotime('-1 month')));

            $timeamp['over'] = strtotime(date('Y-m-01'));

            break;

        case 'preweek'://上周 注意我们是从周一开始算

            $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-2 week Monday')));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('-1 week Monday +1 day')));

            break;

        case 'nowweek'://本周

            $timeamp['start'] = strtotime(date('Y-m-d',strtotime('-1 week Monday')));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('+1 day')));

            break;

        case 'preday'://30

            $timeamp['start'] = strtotime(date('Y-m-d'),strtotime($param.' day'));

            $timeamp['end'] = strtotime(date('Y-m-d'));

            break;

        case 'nextday'://30

            $timeamp['start'] = strtotime(date('Y-m-d'));

            $timeamp['over'] = strtotime(date('Y-m-d'),strtotime($param.' day'));

            break;

        case 'preyear'://去年

            $timeamp['start'] = strtotime(date('Y-01-01',strtotime('-1 year')));

            $timeamp['over'] = strtotime(date('Y-12-31',strtotime('-1 year')));

            break;

        case 'nowyear'://今年

            $timeamp['start'] = strtotime(date('Y-01-01'));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('+1 day')));

            break;

        case 'quarter'://季度

            $quarter = ceil((date('m'))/3);

            $timeamp['start'] = mktime(0,$quarter*3-2,date('Y'));

            $timeamp['over'] = mktime(0,$quarter*3+1,date('Y'));

            break;

        default:

            $timeamp['start'] = strtotime(date('Y-m-d'));

            $timeamp['over'] = strtotime(date('Y-m-d',strtotime('+1 day')));

            break;

    }

    return $timeamp;

}

写在最后

小发现:在进行测试的时候发现了 date()函数比较有意思的地方,可以直接拼接结果,当你把y-m-d h:i:s中的一部分写死后仍然是可以执行的,结果就是你写死的数值,后面有机会深入研究下底层代码,好像是在C语言中,结构体来实现日期以及时间戳的格式,传参是进行了判断,所以可以达到不同形式的显示。strtotime() 函数也很巧妙,牛哇牛哇,以后有新发现会继续补充,有错误请大佬指正。

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...