|
1 | 1 | <?php declare(strict_types=1); |
2 | 2 |
|
3 | | -namespace Lkrms\Support; |
| 3 | +namespace Lkrms\Support\Date; |
4 | 4 |
|
5 | | -use Lkrms\Concern\TFullyReadable; |
6 | | -use Lkrms\Contract\IDateFormatter; |
7 | | -use Lkrms\Contract\IDateParser; |
8 | | -use Lkrms\Contract\IImmutable; |
9 | | -use Lkrms\Contract\IReadable; |
10 | | -use Lkrms\Support\DateParser\CreateFromFormatDateParser; |
11 | 5 | use Lkrms\Utility\Date; |
12 | 6 | use DateTimeImmutable; |
13 | 7 | use DateTimeInterface; |
14 | 8 | use DateTimeZone; |
15 | 9 |
|
16 | 10 | /** |
17 | | - * An immutable date formatter and parser that optionally applies a preferred |
18 | | - * timezone to both operations |
| 11 | + * Formats and parses dates, optionally applying a preferred timezone to both |
| 12 | + * operations |
19 | 13 | * |
20 | | - * @property-read string $Format |
21 | | - * @property-read DateTimeZone|null $Timezone |
22 | | - * @property-read IDateParser[] $Parsers |
| 14 | + * @api |
23 | 15 | */ |
24 | | -final class DateFormatter implements IDateFormatter, IImmutable, IReadable |
| 16 | +final class DateFormatter implements DateFormatterInterface |
25 | 17 | { |
26 | | - use TFullyReadable; |
| 18 | + private string $Format; |
27 | 19 |
|
28 | | - /** |
29 | | - * @var string |
30 | | - */ |
31 | | - protected $Format; |
32 | | - |
33 | | - /** |
34 | | - * @var DateTimeZone|null |
35 | | - */ |
36 | | - protected $Timezone; |
| 20 | + private ?DateTimeZone $Timezone; |
37 | 21 |
|
38 | 22 | /** |
39 | | - * @var IDateParser[] |
| 23 | + * @var DateParserInterface[] |
40 | 24 | */ |
41 | | - protected $Parsers; |
| 25 | + private array $Parsers; |
42 | 26 |
|
43 | 27 | /** |
44 | 28 | * @param DateTimeZone|string|null $timezone |
45 | 29 | */ |
46 | | - public function __construct(string $format = DateTimeInterface::ATOM, $timezone = null, IDateParser ...$parsers) |
| 30 | + public function __construct(string $format = DateTimeInterface::ATOM, $timezone = null, DateParserInterface ...$parsers) |
47 | 31 | { |
48 | 32 | $this->Format = $format; |
49 | | - $this->Timezone = $timezone === null ? null : Date::timezone($timezone); |
50 | | - $this->Parsers = $parsers ?: [new CreateFromFormatDateParser($format)]; |
| 33 | + $this->Timezone = is_string($timezone) ? new DateTimeZone($timezone) : $timezone; |
| 34 | + $this->Parsers = $parsers ?: [new DateFormatParser($format)]; |
51 | 35 | } |
52 | 36 |
|
53 | 37 | /** |
54 | | - * Format a date after optionally applying the preferred timezone |
55 | | - * |
56 | | - * If `$date` is a `DateTime` object, {@see DateFormatter::$Timezone} is |
57 | | - * set, and `$date->Timezone` has a different value, `$date` is converted to |
58 | | - * a `DateTimeImmutable` before applying the timezone. The original |
59 | | - * `DateTime` object is not modified. |
| 38 | + * @inheritDoc |
60 | 39 | */ |
61 | 40 | public function format(DateTimeInterface $date): string |
62 | 41 | { |
63 | | - if ($this->Timezone && |
64 | | - $this->Timezone->getName() !== $date->getTimezone()->getName()) { |
| 42 | + if ( |
| 43 | + $this->Timezone && |
| 44 | + $this->Timezone->getName() !== $date->getTimezone()->getName() |
| 45 | + ) { |
65 | 46 | $date = Date::immutable($date)->setTimezone($this->Timezone); |
66 | 47 | } |
67 | 48 |
|
68 | 49 | return $date->format($this->Format); |
69 | 50 | } |
70 | 51 |
|
71 | 52 | /** |
72 | | - * Convert a string to a date, if possible |
73 | | - * |
74 | | - * @return DateTimeImmutable|null a `DateTimeImmutable` object on success or |
75 | | - * `null` on failure. |
| 53 | + * @inheritDoc |
76 | 54 | */ |
77 | 55 | public function parse(string $value): ?DateTimeImmutable |
78 | 56 | { |
79 | 57 | foreach ($this->Parsers as $parser) { |
80 | | - if ($date = $parser->parse($value, $this->Timezone)) { |
| 58 | + $date = $parser->parse($value, $this->Timezone); |
| 59 | + if ($date) { |
81 | 60 | return $date; |
82 | 61 | } |
83 | 62 | } |
|
0 commit comments