PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / trunk
MailPoet – Newsletters, Email Marketing, and Automation vtrunk
5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor / dragonmantank / cron-expression / src / Cron / HoursField.php
mailpoet / vendor / dragonmantank / cron-expression / src / Cron Last commit date
AbstractField.php 2 years ago CronExpression.php 9 months ago DayOfMonthField.php 2 years ago DayOfWeekField.php 2 years ago FieldFactory.php 2 years ago FieldFactoryInterface.php 2 years ago FieldInterface.php 2 years ago HoursField.php 2 years ago MinutesField.php 2 years ago MonthField.php 2 years ago index.php 2 years ago
HoursField.php
151 lines
1 <?php
2 declare(strict_types=1);
3 namespace Cron;
4 if (!defined('ABSPATH')) exit;
5 use DateTimeInterface;
6 use DateTimeZone;
7 class HoursField extends AbstractField
8 {
9 protected $rangeStart = 0;
10 protected $rangeEnd = 23;
11 protected $transitions = [];
12 protected $transitionsStart = null;
13 protected $transitionsEnd = null;
14 public function isSatisfiedBy(DateTimeInterface $date, $value, bool $invert): bool
15 {
16 $checkValue = (int) $date->format('H');
17 $retval = $this->isSatisfied($checkValue, $value);
18 if ($retval) {
19 return $retval;
20 }
21 // Are we on the edge of a transition
22 $lastTransition = $this->getPastTransition($date);
23 if (($lastTransition !== null) && ($lastTransition["ts"] > ((int) $date->format('U') - 3600))) {
24 $dtLastOffset = clone $date;
25 $this->timezoneSafeModify($dtLastOffset, "-1 hour");
26 $lastOffset = $dtLastOffset->getOffset();
27 $dtNextOffset = clone $date;
28 $this->timezoneSafeModify($dtNextOffset, "+1 hour");
29 $nextOffset = $dtNextOffset->getOffset();
30 $offsetChange = $nextOffset - $lastOffset;
31 if ($offsetChange >= 3600) {
32 $checkValue -= 1;
33 return $this->isSatisfied($checkValue, $value);
34 }
35 if ((! $invert) && ($offsetChange <= -3600)) {
36 $checkValue += 1;
37 return $this->isSatisfied($checkValue, $value);
38 }
39 }
40 return $retval;
41 }
42 public function getPastTransition(DateTimeInterface $date): ?array
43 {
44 $currentTimestamp = (int) $date->format('U');
45 if (
46 ($this->transitions === null)
47 || ($this->transitionsStart < ($currentTimestamp + 86400))
48 || ($this->transitionsEnd > ($currentTimestamp - 86400))
49 ) {
50 // We start a day before current time so we can differentiate between the first transition entry
51 // and a change that happens now
52 $dtLimitStart = clone $date;
53 $dtLimitStart = $dtLimitStart->modify("-12 months");
54 $dtLimitEnd = clone $date;
55 $dtLimitEnd = $dtLimitEnd->modify('+12 months');
56 $this->transitions = $date->getTimezone()->getTransitions(
57 $dtLimitStart->getTimestamp(),
58 $dtLimitEnd->getTimestamp()
59 );
60 if (empty($this->transitions)) {
61 return null;
62 }
63 $this->transitionsStart = $dtLimitStart->getTimestamp();
64 $this->transitionsEnd = $dtLimitEnd->getTimestamp();
65 }
66 $nextTransition = null;
67 foreach ($this->transitions as $transition) {
68 if ($transition["ts"] > $currentTimestamp) {
69 continue;
70 }
71 if (($nextTransition !== null) && ($transition["ts"] < $nextTransition["ts"])) {
72 continue;
73 }
74 $nextTransition = $transition;
75 }
76 return ($nextTransition ?? null);
77 }
78 public function increment(DateTimeInterface &$date, $invert = false, $parts = null): FieldInterface
79 {
80 $originalTimestamp = (int) $date->format('U');
81 // Change timezone to UTC temporarily. This will
82 // allow us to go back or forwards and hour even
83 // if DST will be changed between the hours.
84 if (null === $parts || '*' === $parts) {
85 if ($invert) {
86 $date = $date->sub(new \DateInterval('PT1H'));
87 } else {
88 $date = $date->add(new \DateInterval('PT1H'));
89 }
90 $date = $this->setTimeHour($date, $invert, $originalTimestamp);
91 return $this;
92 }
93 $parts = false !== strpos($parts, ',') ? explode(',', $parts) : [$parts];
94 $hours = [];
95 foreach ($parts as $part) {
96 $hours = array_merge($hours, $this->getRangeForExpression($part, 23));
97 }
98 $current_hour = (int) $date->format('H');
99 $position = $invert ? \count($hours) - 1 : 0;
100 $countHours = \count($hours);
101 if ($countHours > 1) {
102 for ($i = 0; $i < $countHours - 1; ++$i) {
103 if ((!$invert && $current_hour >= $hours[$i] && $current_hour < $hours[$i + 1]) ||
104 ($invert && $current_hour > $hours[$i] && $current_hour <= $hours[$i + 1])) {
105 $position = $invert ? $i : $i + 1;
106 break;
107 }
108 }
109 }
110 $target = (int) $hours[$position];
111 $originalHour = (int)$date->format('H');
112 $originalDay = (int)$date->format('d');
113 $previousOffset = $date->getOffset();
114 if (! $invert) {
115 if ($originalHour >= $target) {
116 $distance = 24 - $originalHour;
117 $date = $this->timezoneSafeModify($date, "+{$distance} hours");
118 $actualDay = (int)$date->format('d');
119 $actualHour = (int)$date->format('H');
120 if (($actualDay !== ($originalDay + 1)) && ($actualHour !== 0)) {
121 $offsetChange = ($previousOffset - $date->getOffset());
122 $date = $this->timezoneSafeModify($date, "+{$offsetChange} seconds");
123 }
124 $originalHour = (int)$date->format('H');
125 }
126 $distance = $target - $originalHour;
127 $date = $this->timezoneSafeModify($date, "+{$distance} hours");
128 } else {
129 if ($originalHour <= $target) {
130 $distance = ($originalHour + 1);
131 $date = $this->timezoneSafeModify($date, "-" . $distance . " hours");
132 $actualDay = (int)$date->format('d');
133 $actualHour = (int)$date->format('H');
134 if (($actualDay !== ($originalDay - 1)) && ($actualHour !== 23)) {
135 $offsetChange = ($previousOffset - $date->getOffset());
136 $date = $this->timezoneSafeModify($date, "+{$offsetChange} seconds");
137 }
138 $originalHour = (int)$date->format('H');
139 }
140 $distance = $originalHour - $target;
141 $date = $this->timezoneSafeModify($date, "-{$distance} hours");
142 }
143 $date = $this->setTimeHour($date, $invert, $originalTimestamp);
144 $actualHour = (int)$date->format('H');
145 if ($invert && ($actualHour === ($target - 1) || (($actualHour === 23) && ($target === 0)))) {
146 $date = $this->timezoneSafeModify($date, "+1 hour");
147 }
148 return $this;
149 }
150 }
151