🎖️最好用的PHP时间日期类库(支持Composer加载)

zjkal✅

分享一个最方便的PHP时间助手类, 这个类库的最大特色是:所有方法都可传入任意类型的时间格式&时间戳

通过Composer导入类库

composer require zjkal/time-helper

使用方法
首先在类中引用TimeHelper助手类

use zjkal\TimeHelper;

1. 获取需要的秒数

一般用于设置缓存时间,设置结束时间等

//返回到今天晚上零点之前的秒数
TimeHelper::secondEndToday();

//返回N分钟的秒数(默认为1分钟)
TimeHelper::secondMinute(5);

//返回N小时的秒数(默认为1小时)
TimeHelper::secondHour(2);

//返回N天的秒数(默认为1天)
TimeHelper::secondDay(10);

//返回N周的秒数(默认为1周)
TimeHelper::secondWeek(4);

2. 返回友好的日期格式,比如N秒前,N分钟前,N小时前等等

一般用于社交类平台,评论,论坛等

//一共2个参数:
//第1个参数传入字符串类型的时间或者时间戳都可以,
//第2个参数为语言(默认为中文,需要英文请传入en)
TimeHelper::toFriendly('2022-3-2 10:15:33');
//英文
TimeHelper::toFriendly(1646186290, 'en');

3. 判断时间范围

//判断日期是否为今天
TimeHelper::isToday('2020-4-10 23:01:11');

//判断日期是否为本周
TimeHelper::isThisWeek('2020-5-1');

//判断日期是否为本月
TimeHelper::isThisMonth(1586451741);

//判断日期是否为今年
TimeHelper::isThisYear('Apr 11, 2020');

//判断指定时间是星期几,不传默认为当前时间. 返回值为1-7,1为星期一,7为星期日
TimeHelper::getWeek('2022-11-27');

4. 计算两个时间相差值

如果只传入一个参数,则与当前时间比较

//计算两个日期相差天数
TimeHelper::diffDays('2022-4-10 23:01:11','Apr 11, 2020');

//计算两个日期相差周数
TimeHelper::diffWeeks('2022-4-10 23:01:11');

//计算两个日期相差月数
TimeHelper::diffMonths(1586451741,'Apr 11, 2020');

//计算两个日期相差年数
TimeHelper::diffYears('2022-4-10 23:01:11','Apr 11, 2020');

5. 返回N小时/天/星期/月/年前或者后的时间戳

只传入1个参数以当前时间计算,传入第2个参数则以该时间计算,传入第3个参数为true,则时间取整

//返回指定时间3分钟前0秒的时间戳
TimeHelper::beforeMinute(3,'2022-3-2 10:15:33',true);

//返回当前时间5分钟后的时间戳
TimeHelper::afterMinute(5);

//返回指定时间1小时前的时间戳(请注意此用法为php8之后的用法)
TimeHelper::beforeHour(datetime:'Apr 11, 2020');

//返回2小时后的时间戳
TimeHelper::afterHour(2);

//返回15天前0点的时间戳
TimeHelper::beforeDay(15,null,true);

//返回15天后的时间戳
TimeHelper::afterDay(15);

//返回指定时间2星期前的时间戳
TimeHelper::beforeWeek(2,'2022-4-10 23:01:11');

//返回指定时间10星期后的时间戳
TimeHelper::afterWeek(10,1646360133);

//返回指定时间1个月前的时间戳(请注意此用法为php8之后的用法)
TimeHelper::beforeMonth(datetime:1646360133);

//返回5个月后的时间戳
TimeHelper::afterMonth(5);

//返回指定时间3年前的时间戳
TimeHelper::beforeYear(3,'2022-7-11');

//返回2年后的时间戳
TimeHelper::afterYear(2);

6.获取当前秒级/毫秒级/微秒级/纳秒级的时间戳,生成订单号或者与其他编程语言对接时可能会用到


//获取秒级的时间戳,可用time()代替
TimeHelper::getTimestamp();

//获取毫秒级的时间戳
TimeHelper::getMilliTimestamp();

//获取微秒级的时间戳
TimeHelper::getMicroTimestamp();

//获取纳秒级的时间戳
TimeHelper::getNanoTimestamp();

7.日期转换

用于爬虫爬取网页或第三方程序对接时,时间格式不统一的转换

//将任意格式的时间转换为指定格式
//第一个参数是时间格式,与系统函数date()的格式保持一致
//第二个参数则是任意格式的时间日期,不传则默认为当前时间,可用系统函数date()代替
TimeHelper::format('Y-m-d H:i:s','May 3, 2022');

//判断一个字符串是否为时间戳,是返回true,否返回false
TimeHelper::isTimestamp(1646360133);

//将任意时间类型的字符串转为时间戳
TimeHelper::toTimestamp('Apr 11, 2020');

8.平闰年相关

比原生方法使用起来更方便

//判断是否为闰年,是返回true,否返回false
TimeHelper::isLeapYear('2020-3-2 10:15:33');

//判断该日期的当年有多少天
TimeHelper::daysInYear(1646360133);

//判断该日期的当月有多少天
TimeHelper::daysInMonth('Apr 11, 2020');

9.时区相关 🆕

主要提供获取不同时区的时间和转换不同时区的时间的方法

//将任意格式的时间或时间戳转换为指定时区的时间
//第一个参数为要转换的目标时区
//第二个参数为原时区,不传则默认为当前时区
//第三个参数为任意格式的时间或时间戳,不传则默认为当前时间
//第四个参数为时间格式,与系统函数date()的格式保持一致,不传则默认为Y-m-d H:i:s
TimeHelper::timezoneFormat('Europe/London', 'Asia/Shanghai', '2023-8-15 19:16:43', 'H:i:s');
//获得当前洛杉矶的时间
TimeHelper::timezoneFormat('America/Los_Angeles');
//将洛杉矶时间转换为伦敦时间
TimeHelper::timezoneFormat('Europe/London', 'America/Los_Angeles', 'Aug 15, 2023 10:15:33', 'H:i:s');
//将时间戳转换为伦敦时间
TimeHelper::timezoneFormat('Europe/London', null, 1692097543);

所支持的时区列表请参考时区列表

10.国内节假日/工作日相关 🔥

专门针对国内的节假日进行判断,目前包含2020年-2024年的节假日数据,后续也会持续更新.
为了便于维护,另起了一个类ChinaHoliday,同样可以传入任意类型的时间格式或时间戳

use zjkal\ChinaHoliday;

//判断指定日期是否为国内的工作日
ChinaHoliday::isWorkday('2023-01-23');

//判断指定日期是否为国内的节假日
ChinaHoliday::isHoliday(1646360133);

特别说明: 所有时间的方法都可以传入任意格式的时间或者时间戳, 但是有一点请注意 m/d/y 或 d-m-y 格式的日期,如果分隔符是斜线(/),则使用美洲的 m/d/y 格式。如果分隔符是横杠(-)或者点(.),则使用欧洲的 d-m-y 格式。为了避免潜在的错误,您应该尽可能使用 YYYY-MM-DD 格式或其他格式.

最后贴上github传送门:https://github.com/zjkal/time-helper

1784 7 5
7个评论

liziyu

先点赞👍
再请求,能否增加一个,判断某一天是否为“工作日”的判断?

  • zjkal✅ 2023-03-07

    如果只是判断周六和周日, 或者周一到周五, 这个可以加. 但是节日的休息是无法通过程序判断的

  • liziyu 2023-03-08

    是的,每年年底11月份左右,行政出台下年的工作日,这个目前还没找到接口。

  • zjkal✅ 2023-03-08

    我已经想到解决办法了, 最近这两三天就会增加你说的这个, 针对国内节假日和工作日的判断方法

  • liziyu 2023-03-08

    大佬辛苦了!💦

  • zjkal✅ 2023-03-08

    不敢当啊, 不过我已经写了一个方法, 自己测试感觉没问题, 你如果有需要的话, 可以去用一用,有问题喊我

zjkal✅

更新补充: 增加了专门用于判断是否为国内的工作日/节假日的方法, 详情请直接查看Github

  • 暂无评论
zjkal✅

更新补充:增加了专门用于转换时区的方法

  • 暂无评论
zjkal✅

更新补充: 增加了两个时间比较早晚的方法:compare()

  • 暂无评论
zjkal✅

已增加2024年国内放假数据, 请及时update

  • 暂无评论
csnow

牛逼啊

TM

大佬,可以增加一下根据两个时间判断(某个时间不传默认今天的时间)是否在前面传入的两个时间之间的判断吗

  • zjkal✅ 15天前

    判断之间可能不太常用, 建议使用两次compare()方法:

    
    $my_date = Timehelper::now();
    $from_date = '2024-07-01 12:00:00';
    $to_date = '2024-08-01 12:00:00';
    
    //判断$my_date是否在$from_date和$to_date之间
    if (Timehelper::compare($my_date,$from_date) === 1 && Timehelper::compare($my_date,$to_date) === -1){
        echo '在';
    }else{
        echo '不在';
    }

    你也可以简单做个封装

  • TM 14天前

    好的好的

zjkal✅

350
积分
0
获赞数
0
粉丝数
2023-03-02 加入
×
🔝