korshunov / timeinterval
0.1.6
2020-07-19 13:44 UTC
Requires
- php: ^7.1|^8.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ~9.2
README
处理时间量(小时、分钟、秒)的类。绝对时间间隔与日历(年、月)无关。特性
- 创建方式:秒、日期字符串、间隔规范字符串
- 转换为小时、分钟、秒
- 与DateInterval兼容的格式,以及额外的格式占位符:%x, %X - 分钟的数量
- 正负间隔
实例
- TimeInterval实例,可以通过秒创建,例如
$time = new TimeInterval(123);
或其它时间单位,例如
$time = new TimeInterval(1, TimeInterval::HOUR);
- TimeInterval实例,可以通过H:M:S字符串创建,例如
$time = TimeInterval::createFromHMS('-122:45'); // negative interval $time = TimeInterval::createFromHMS('122:45'); $time = TimeInterval::createFromHMS('122:45:58');
- TimeInterval实例,可以通过日期字符串创建,例如
$time = TimeInterval::createFromDateString('1 day + 12 hours');
- TimeInterval实例,可以通过间隔规范字符串创建,例如
$time = TimeInterval::createFromIntervalSpec('P1DT12H');
可以处理正负间隔。
添加和减去间隔
- 添加
$time1 = new TimeInterval(1, TimeIntervalInterface::HOUR); $time2 = new TimeInterval(60, TimeIntervalInterface::MINUTE); $time1->add($time2); echo $time1->convertToSeconds(); // 7200
- 减去
$time1 = new TimeInterval(1, TimeIntervalInterface::HOUR); $time2 = new TimeInterval(60, TimeIntervalInterface::MINUTE); $time1->sub($time2); echo $time1->convertToSeconds(); // 0
- 修改
$time = new TimeInterval(1, TimeIntervalInterface::HOUR); $time->modify(-1, TimeIntervalInterface::HOUR); echo $time->convertToSeconds(); // 0
格式化
与\DateInterval::format()兼容的格式,但只有时间单位占位符。可用占位符:%r, %R, %h, %H, %m, %M, %s, %S 额外占位符:%x, %X - 间隔中的分钟数量(四舍五入到整数)
$time = new TimeInterval(3600 + 60 + 55); echo $time->format('%H:%I:%S'); // 01:01:55
示例
use Korshunov\TimeInterval\TimeInterval; use Korshunov\TimeInterval\TimeIntervalImmutable; use Korshunov\TimeInterval\TimeIntervalInterface; $days = 5; $hours = 8; $minutes = 15; $seconds = 15; // BASE $convertToSeconds = $days * 86400 + $hours * 3600 + $minutes * 60 + $seconds; $time = new TimeInterval($convertToSeconds); echo $time->convertToHours(); // 128 // with precision echo $time->convertToHours(2); //128.25 echo $time->convertToHours(3); //128.254 echo $time->convertToMinutes(); // 7695 // with precision echo $time->convertToMinutes(2); // 7695.25 echo $time->convertToMinutes(3); // 7695.25 echo $time->convertToSeconds(); // 461715 // MODIFY $time = new TimeInterval($days, TimeIntervalInterface::DAY); $time->modify($hours, TimeIntervalInterface::HOUR); $time->modify($minutes, TimeIntervalInterface::MINUTE); $time->modify($seconds, TimeIntervalInterface::SECOND); // or $time->modify($seconds); echo $time->convertToHours(); // 128 // with precision echo $time->convertToHours(2); //128.25 echo $time->convertToHours(3); //128.254 echo $time->convertToMinutes(); // 7695 // with precision echo $time->convertToMinutes(2); // 7695.25 echo $time->convertToMinutes(3); // 7695.25 echo $time->convertToSeconds(); // 461715 // ADD $time = new TimeInterval(); $time1 = new TimeInterval($days, TimeIntervalInterface::DAY); $time2 = new TimeInterval($hours, TimeIntervalInterface::HOUR); $time3 = new TimeInterval($minutes, TimeIntervalInterface::MINUTE); $time4 = new TimeInterval($seconds, TimeIntervalInterface::SECOND); // adding $time->add($time1)->add($time2); $time->add($time3); $time->add($time4); echo $time->convertToHours(); // 128 // with precision echo $time->convertToHours(2); //128.25 echo $time->convertToHours(3); //128.254 echo $time->convertToMinutes(); // 7695 // with precision echo $time->convertToMinutes(2); // 7695.25 echo $time->convertToMinutes(3); // 7695.25 echo $time->convertToSeconds(); // 461715 // SUB $time = new TimeInterval($convertToSeconds); $time1 = new TimeInterval($days, TimeIntervalInterface::DAY); $time2 = new TimeInterval($hours, TimeIntervalInterface::HOUR); $time3 = new TimeInterval($minutes, TimeIntervalInterface::MINUTE); $time4 = new TimeInterval($seconds, TimeIntervalInterface::SECOND); // adding $time->sub($time1)->sub($time2); $time->sub($time3); $time->sub($time4); echo $time->convertToSeconds(); // 0 // Immutable $timeImmutable = new TimeIntervalImmutable($convertToSeconds); $time1 = new TimeInterval($days, TimeIntervalInterface::DAY); $time2 = new TimeInterval($hours, TimeIntervalInterface::HOUR); $time3 = new TimeInterval($minutes, TimeIntervalInterface::MINUTE); $time4 = new TimeInterval($seconds, TimeIntervalInterface::SECOND); $timeNew = $timeImmutable->sub($time1)->sub($time2)->sub($time3)->sub($time4); echo $timeImmutable->convertToSeconds(); // 461715 echo $timeNew->convertToSeconds(); // 0 // Create from HMS $time = TimeInterval::createFromHMS('24:05:15'); echo $time->convertToSeconds(); // 86715 $time = TimeInterval::createFromHMS('-24:05:15'); echo $time->convertToSeconds(); // -86715 // Create from date string $time = TimeInterval::createFromDateString('24 hours + 5 minutes + 15 seconds'); echo $time->convertToSeconds(); // 86715 // Create from interval spec $time = TimeInterval::createFromIntervalSpec('P1DT0H5M15S'); echo $time->convertToSeconds(); // 86715 // Format $time = new TimeInterval($days, TimeIntervalInterface::DAY); $time->modify($hours, TimeIntervalInterface::HOUR); $time->modify($minutes, TimeIntervalInterface::MINUTE); $time->modify($seconds, TimeIntervalInterface::SECOND); echo $time->getHours(); // 128 echo $time->getMinutes(); // 15 echo $time->getSeconds(); // 15 echo $time->format('%H:%I:%S'); // 128:15:15 echo $time->format('%x min. %s sec.'); // 7695 min. 15 sec. $timeNegative = new TimeInterval(); $timeNegative->sub($time); echo $timeNegative->format('%r%H:%I:%S'); // -128:15:15 echo $timeNegative->format('%r%x min. %s sec.'); // -7695 min. 15 sec. // convert TimeInterval to DateInterval $time = new TimeInterval($convertToSeconds); /** @var DateInterval $dateInterval */ $dateInterval = $time->createDateInterval();