Upstream spatie/period state of the touched files before b1e3380fb0

This commit is contained in:
upstream committed 2026-09-03 14:39:22 +02:00
commit 5e077c8688
3 files changed
+355

No files matched your search

+142
View File
@@ -0,0 +1,142 @@
<?php
namespace Spatie\Period\PeriodTraits;
use DateTimeImmutable;
use Spatie\Period\Boundaries;
use Spatie\Period\Exceptions\CannotCeilLowerPrecision;
use Spatie\Period\PeriodDuration;
use Spatie\Period\Precision;
/** @mixin \Spatie\Period\Period */
trait PeriodGetters
{
protected string $asString;
public function isStartIncluded(): bool
{
return $this->boundaries->startIncluded();
}
public function isStartExcluded(): bool
{
return $this->boundaries->startExcluded();
}
public function isEndIncluded(): bool
{
return $this->boundaries->endIncluded();
}
public function isEndExcluded(): bool
{
return $this->boundaries->endExcluded();
}
public function start(): DateTimeImmutable
{
return $this->start;
}
public function includedStart(): DateTimeImmutable
{
return $this->includedStart;
}
public function end(): DateTimeImmutable
{
return $this->end;
}
public function includedEnd(): DateTimeImmutable
{
return $this->includedEnd;
}
public function ceilingEnd(?Precision $precision = null): DateTimeImmutable
{
$precision ??= $this->precision;
if ($precision->higherThan($this->precision)) {
throw CannotCeilLowerPrecision::precisionIsLower($this->precision, $precision);
}
return $this->precision->ceilDate($this->includedEnd, $precision);
}
public function length(): int
{
// Length of month and year are not fixed, so we can't predict the length without iterate
// TODO: maybe we can use cal_days_in_month ?
if ($this->precision->equals(Precision::MONTH(), Precision::YEAR())) {
return iterator_count($this);
}
if ($this->precision->equals(Precision::HOUR(), Precision::MINUTE(), Precision::SECOND())) {
$length = abs($this->includedEnd()->getTimestamp() - $this->includedStart()->getTimestamp());
if ($this->precision->equals(Precision::SECOND())) {
return $length + 1;
}
$length = floor($length / 60);
if ($this->precision->equals(Precision::MINUTE())) {
return $length + 1;
}
return floor($length / 60) + 1;
}
return $this->includedStart()->diff($this->includedEnd())->days + 1;
}
public function duration(): PeriodDuration
{
return $this->duration;
}
public function precision(): Precision
{
return $this->precision;
}
public function boundaries(): Boundaries
{
return $this->boundaries;
}
public function asString(): string
{
if (! isset($this->asString)) {
$this->asString = $this->resolveString();
}
return $this->asString;
}
private function resolveString(): string
{
$string = '';
if ($this->isStartIncluded()) {
$string .= '[';
} else {
$string .= '(';
}
$string .= $this->start()->format($this->precision->dateFormat());
$string .= ',';
$string .= $this->end()->format($this->precision->dateFormat());
if ($this->isEndIncluded()) {
$string .= ']';
} else {
$string .= ')';
}
return $string;
}
}