zeeproject / date-range
日期范围实现
0.5.0
2023-05-17 14:44 UTC
Requires
- php: ~8.2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
- phpunit/phpunit: ^10.1
- psalm/plugin-phpunit: ^0.18.4
- scrutinizer/ocular: ^1.9
- vimeo/psalm: ^5.11
This package is auto-updated.
Last update: 2024-09-20 00:21:08 UTC
README
PHP中缺少的 日期范围 实现。
安装
使用 Composer
composer require zeeproject/date-range
使用方法
DateRange - 值对象
实例化值对象并访问属性
$range = new DateRange(new DateTime('-1 day'), new DateTime('+1 day')); // Checking if range has start date $range->hasStartDate(); // Accessing range start date $range->getStartDate()->format('c'); // Checking if range has end date $range->hasEndDate(); // Accessing range end date $range->getEndDate()->format('c'); // Checking if range is finite $range->isFinite(); // Checking if range already started $range->isStarted(); // Checking if range already ended $range->isEnded(); // Checking if range started on specific date $range->isStartedOn(new DateTime()); // Checking if range ended on specific date $range->isEndedOn(new DateTime()); // Accessing range duration in seconds $range->getTimestampInterval(); // Accessing range interval $range->getDateInterval()->format('%s'); // Printing echo $range; // Representing as JSON json_encode($range);
遍历范围
$range = new DateRange(new DateTime('-1 day'), new DateTime('+1 day')); foreach ($range->getDatePeriod(new DateInterval('P1D')) as $date) { echo $date->format('Y-m-d'); }
将范围拆分为更小的范围
$range = new DateRange(new DateTime('-1 day'), new DateTime('+1 day')); foreach ($range->split(new DateInterval('P1D')) as $range) { echo $range; }
日期范围不可变,任何更改都会导致新的对象
$initial = new DateRange(new DateTime('-1 day'), new DateTime('+1 day')); $actual = $initial->setStartDate(new DateTime('now')); if ($initial === $actual) { throw new LogicException('Oh, ah'); }
DateRangeProvider - 日期范围构建器
使用构建器创建具有特定规则的新的范围
class RangeForYear implements DateRangeProvider { /** * @var int */ private $year; /** * @param int $year */ public function __construct(int $year) { $this->year = $year; } public function getDateRange(): DateRangeInterface { return new DateRange( new DateTimeImmutable(DateTimeImmutable::createFromFormat('c', "{$this->year}-01-01T00:00:00Z")), new DateTimeImmutable(DateTimeImmutable::createFromFormat('c', "{$this->year}-12-31T23:59:59Z")) ); } }
您的类可能依赖于范围提供者而不是 DateRange
,当预定义范围比范围接口更有意义时很有用
class ReportCalculator { public function calculate(DateRangeProvider $provider) { echo $provider->getDateRange(); } } $calculator->calculate(new RangeForYear(2017)); $calculator->calculate(new RangeForQuarter(2017)); $calculator->calculate(new RangeForMonth(2017));
甚至您的类可能需要具体的范围契约
class ReportCalculator { public function calculate(FiniteDateRangeProvider $provider) { echo $provider->getDateRange(); } }
测试
phpunit
贡献
请参阅 CONTRIBUTING 和 CODE OF CONDUCT 以获取更多详细信息。