🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
TimeSpan — длительность с наносекундной точностью
Назначение
Иммутабельный value object длительности: 64-битные наносекунды, точная арифметика с контролем переполнения, разбор ISO 8601, 1h 30m и relative-строк PHP.
Для чего и как применять
Тайм-ауты, интервалы, конфигурация задержек: TimeSpan::fromString('1h 30m'), ->plus(), ->compareTo(), ->toIso8601(), ->toDateInterval(), человекочитаемо — ->forHumans('ru', 2) («1 час 30 минут»).
Пример
$span = TimeSpan::fromString('1h 30m')->plus(TimeSpan::ofSeconds(15.5));
$span->seconds(); // 5415.5
$span->toIso8601(); // PT1H30M15.5S
TimeSpan::between($start, $end); // из пары моментов
TimeSpan::fromIso8601('P2DT3H');
Анти-паттерны
Календарные годы/месяцы сознательно не принимаются (их длительность неоднозначна): TimeSpan — точная длительность в наносекундах. Для календарной арифметики месяцев/лет используйте CalendarDate (addMonthsNoOverflow(), addYears()).
Жизненный цикл
flowchart TD
A[ofSeconds/ofHours/...] --> S((TimeSpan ns))
B[fromIso8601 / fromString / fromDateString] --> S
C[between / fromDateInterval] --> S
S --> D[plus/minus/multipliedBy/dividedBy]
D --> S
S --> E[seconds()/toIso8601()/toDateInterval()]
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Наносекундная точность хранения | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Контроль целочисленного переполнения | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Разбор ISO 8601 и человекочитаемых строк | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Иммутабельная арифметика | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Отказ от неоднозначных месяцев/лет | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Человекочитаемый вывод forHumans() на 6 языках | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Всего | 🏆 6 | 0 | 3 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano