-
Notifications
You must be signed in to change notification settings - Fork 53
/
DateTimeBuilder.php
148 lines (118 loc) · 3.59 KB
/
DateTimeBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
declare(strict_types=1);
namespace FeedIo\Rule;
use DateTime;
use DateTimeZone;
use Psr\Log\LoggerInterface;
class DateTimeBuilder implements DateTimeBuilderInterface
{
/**
* Supported date formats
*/
protected array $dateFormats = [
\DateTime::RFC2822,
\DateTime::RFC822,
\DateTime::ATOM,
\DateTime::RFC3339,
\DateTime::RFC3339_EXTENDED,
\DateTime::RSS,
\DateTime::W3C,
'Y-m-d\TH:i:s.uP',
'Y-m-d\TH:i:s.uvP',
'Y-m-d\TH:i:s',
'Y-m-d\TH:iP',
'Y-m-d',
'd/m/Y',
'D, d M Y H:i O',
'D, d M Y H:i:s O',
'D M d Y H:i:s e',
'*, m#d#Y - H:i',
'D, d M Y H:i:s \U\T',
'*, d M* Y H:i:s e',
'*, d M Y',
];
protected ?DateTimeZone $feedTimezone = null;
protected DateTimeZone $serverTimezone;
protected string $lastGuessedFormat = DateTime::RFC2822;
public function __construct(protected ?LoggerInterface $logger = null)
{
$this->setTimezone(new DateTimeZone(date_default_timezone_get()));
}
public function addDateFormat(string $dateFormat): DateTimeBuilderInterface
{
$this->dateFormats[] = $dateFormat;
return $this;
}
public function setDateFormats(array $dateFormats): DateTimeBuilderInterface
{
$this->dateFormats = $dateFormats;
return $this;
}
public function getLastGuessedFormat(): string
{
return $this->lastGuessedFormat;
}
public function guessDateFormat(string $date): ?string
{
foreach ($this->dateFormats as $format) {
$test = DateTime::createFromFormat($format, $date);
if ($test instanceof \DateTime) {
$this->lastGuessedFormat = $format;
return $format;
}
}
return null;
}
public function convertToDateTime(string $string): DateTime
{
$string = trim($string);
foreach ([$this->getLastGuessedFormat(), $this->guessDateFormat($string) ] as $format) {
$date = $this->newDate((string) $format, $string);
if ($date instanceof \DateTime) {
$date->setTimezone($this->getTimezone());
return $date;
}
}
if ($this->logger) {
$this->logger->notice("unsupported date format : {$string}, returning current datetime");
}
$date = new DateTime(timezone: $this->getFeedTimezone());
$date->setTimezone($this->getTimezone());
return $date;
}
public function getFeedTimezone(): ?DateTimeZone
{
return $this->feedTimezone;
}
public function setFeedTimezone(DateTimeZone $timezone): void
{
$this->feedTimezone = $timezone;
}
public function resetFeedTimezone(): void
{
$this->feedTimezone = null;
}
public function getServerTimezone(): ?DateTimeZone
{
return $this->serverTimezone;
}
public function setServerTimezone(DateTimeZone $timezone): void
{
$this->serverTimezone = $timezone;
}
public function getTimezone(): ?DateTimeZone
{
return $this->getServerTimezone();
}
public function setTimezone(DateTimeZone $timezone): void
{
$this->setServerTimezone($timezone);
}
protected function newDate(string $format, string $string): DateTime|bool
{
if (!! $this->getFeedTimezone()) {
return DateTime::createFromFormat($format, $string, $this->getFeedTimezone());
}
return DateTime::createFromFormat($format, $string);
}
}