搜索

查看: 3086|回复: 11

[PHP] PHP获取特殊时间戳的方法整理

[复制链接]
发表于 2023-5-4 17:03:10 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:03:10 3086 11 看全部
目录
  • 问题描述
  • 解决方案
  • 今天时间戳与日期
  • 时间戳
  • 日期格式
  • 昨天时间戳与日期
  • 日期格式
  • 本周时间戳与日期
  • 时间戳
  • 日期格式
  • 本月时间戳和日期
  • 时间戳
  • 日期格式
  • 本季度时间戳和日期
  • 时间戳
  • 日期格式
  • 当前年时间戳和日期
  • 时间戳
  • 日期格式
  • strtotime函数获取描述对应时间
  • 明天当前时间
  • 昨天当前时间
  • 下个星期当前时间
  • 上个星期当前时间
  • 下星期几当前时间
  • 上星期几当前时间
  • 时间戳转日期格式
  • 日期格式转时间戳
  • 获取特定时间戳函数
  • 写在最后
    问题描述
    时间在我们日常的代码编写中会是经常出现的筛选或排序条件,尤其是一些特殊时间节点的时间显得尤为突出,例如昨天,当前日期,当前月份,当前季度,以及当前年份的开始以及结束的时间戳,今天对部分相对简便的方法进行了部分整理。

    解决方案
    话不多说,稍微进行分类,贴代码。

    今天时间戳与日期


    时间戳
    当前天的时间戳直接使用当前时间格式,指定起始以及结束时间来实现快速拿到时间戳的效果。
    $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,0,0,date('m'),date('d')-1,date('Y'));
    $overTime = mktime(0,0,0,date('m'),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,0,0,date('m'),date('d')-date('w')+1,date('y'));
    //本周结束时间戳
    $overTime = mktime(23,59,59,date('m'),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,0,0,date('m'),date('d')-date('w')+1,date('y')));
    //本周结束时间戳
    $overTime = date("Y-m-d H:i:s",mktime(23,59,59,date('m'),date('d')-date('w')+7,date('y')));

    本月时间戳和日期
    时间戳
    //本月起始时间时间戳
    $startTime =mktime(0,0,0,date('m'),1,date('Y'));  
    //本月结束时间时间戳
    $overTime =mktime(23,59,59,date('m'),date('t'),date('Y'));
    日期格式
    使用date( )函数进行时间戳转换日期格式。
    //本月起始时间日期格式
    $startTime = date("Y-m-d H:i:s",mktime(0,0,0,date('m'),1,date('Y')));  
    //本月结束时间日期格式
    $overTime = date("Y-m-d H:i:s",mktime(23,59,59,date('m'),date('t'),date('Y')));

    本季度时间戳和日期
    时间戳
    //获取当前季度
    $season = ceil((date('m'))/3);
    //当前季度开始时间戳
    $startTime = mktime(00,00,00,$season*2+1,1,date('Y'));
    //获取当前季度结束时间戳
    $overTime = mktime(23,59,59,$season*3,date('t',mktime(0, 0 , 0,$season*3,1,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",strtotime(date("Y",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 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",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y"))));
                $timeamp['over'] = strtotime(date("Y-m-d H:i:s",mktime(23,59,59,date("m"),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, 0, 0,$quarter*3-2,1,date('Y'));
                $timeamp['over'] = mktime(0, 0, 0,$quarter*3+1,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() 函数也很巧妙,牛哇牛哇
    到此这篇关于PHP获取特殊时间戳的方法整理的文章就介绍到这了,更多相关PHP获取特殊时间戳内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 22:19:13 | 显示全部楼层
    落败的青春阳落s 2023-6-28 22:19:13 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 18:51:11 | 显示全部楼层
    xinting_6ym 2023-6-29 18:51:11 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 13:02:24 | 显示全部楼层
    风吹吹蛋蛋疼风w 2023-6-30 13:02:24 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 15:31:12 | 显示全部楼层
    当当当当裤裆坦 2023-6-30 15:31:12 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-1 02:49:49 | 显示全部楼层
    123456823 2023-7-1 02:49:49 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-7-3 07:09:58 | 显示全部楼层
    dxf17 2023-7-3 07:09:58 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-7-3 12:51:42 | 显示全部楼层
    十二音阶囤 2023-7-3 12:51:42 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 21:13:28 | 显示全部楼层
    无人岛屿颈 2023-7-3 21:13:28 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-4 10:29:08 | 显示全部楼层
    风来时狂放 2023-7-4 10:29:08 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表