gamez / duration
轻松处理持续时间
4.3
2021-11-01 15:45 UTC
Requires
- php: ^7.3.4|^8.0
Requires (Dev)
- phpstan/phpstan: ^0.12.63
- phpunit/phpunit: ^9.5
README
轻松处理持续时间。
你喜欢使用 DateInterval
来计算和操作持续时间吗?我也不喜欢,那么让我们来解决这个问题吧!
安装
您可以使用 Composer 安装此包
composer require gamez/duration
然后您可以使用 Duration
<?php use Gamez\Duration; $duration = Duration::make('13 minutes 37 seconds'); // or start with nothing $duration = Duration::none();
参考
支持的输入值
DateIntervals
use Gamez\Duration; Duration::make('PT13M37S'); Duration::make(new DateInterval('PT13M37S'));
冒号表示法
use Gamez\Duration; Duration::make('13:37'); // minutes:seconds Duration::make('13:37:37'); // hours:minutes:seconds
文本表示法
文本表示法是任何可以被 DateInterval::createFromDateString() 处理的值
use Gamez\Duration; Duration::make('13 minutes 37 seconds');
转换
转换后,持续时间将
- 转换为 DateInterval 表示形式
- 优化,例如输入值为 60 秒将输出为 "1 分钟",例如 "PT60S" 将转换为 "PT1H"
use Gamez\Duration; $duration = Duration::make('8 days 29 hours 77 minutes'); echo (string) $duration; // P9DT6H17M echo json_encode($duration); // "P9DT6H17M"
比较
use Gamez\Duration; $oneSecond = Duration::make('1 second'); $sixtySeconds = Duration::make('60 seconds'); $oneMinute = Duration::make('1 minute'); $oneHour = Duration::make('1 hour'); $oneSecond->isSmallerThan($oneMinute); // true $oneHour->isLargerThan($oneMinute); // true $oneMinute->equals($sixtySeconds); // true $durations = [$oneMinute, $oneSecond, $oneHour, $sixtySeconds]; usort($durations, function ($a, $b) { return $a->compareTo($b); }); // -> [$oneSecond, $sixtySeconds, $oneMinute, $oneHour]
操作
结果将总是四舍五入到秒。
use Gamez\Duration; $thirty = Duration::make('30 seconds'); echo $thirty->withAdded('31 seconds'); // PT1M1S echo $thirty->withSubtracted('29 seconds'); // PT1S echo $thirty->multipliedBy(3); // PT1M30S echo $thirty->dividedBy(2.5); // PT12S $thirty->multipliedBy(-1); // InvalidArgumentException $thirty->withSubtracted('31 seconds'); // InvalidArgumentException
路线图
- 支持更多输入格式
- 添加"人类可读的输出"(如冒号表示法)
- 支持精度(类似于 spatie/period)
- ...