PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.2.0
Independent Analytics – WordPress Analytics Plugin v2.2.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Date_Range / Date_Range.php
independent-analytics / IAWP / Date_Range Last commit date
Date_Range.php 2 years ago Exact_Date_Range.php 2 years ago Relative_Date_Range.php 2 years ago
Date_Range.php
103 lines
1 <?php
2
3 namespace IAWP_SCOPED\IAWP\Date_Range;
4
5 use DateTime;
6 use IAWP_SCOPED\Proper\Timezone;
7 /** @internal */
8 abstract class Date_Range
9 {
10 /**
11 * @var DateTime
12 */
13 protected $start;
14 /**
15 * @var DateTime
16 */
17 protected $end;
18 public abstract function label() : string;
19 /**
20 * @return DateTime
21 */
22 public function start() : DateTime
23 {
24 return $this->start;
25 }
26 /**
27 * @return string
28 */
29 public function iso_start() : string
30 {
31 return $this->start->format('Y-m-d\\TH:i:s');
32 }
33 /**
34 * @return DateTime
35 */
36 public function end() : DateTime
37 {
38 return $this->end;
39 }
40 /**
41 * @return string
42 */
43 public function iso_end() : string
44 {
45 return $this->end->format('Y-m-d\\TH:i:s');
46 }
47 public function previous_period() : Date_Range
48 {
49 $range_size = $this->range_size_in_days();
50 $previous_start = (clone $this->start)->modify("-{$range_size} days");
51 $previous_end = (clone $this->end)->modify("-{$range_size} days");
52 return new Exact_Date_Range($previous_start, $previous_end, \false);
53 }
54 public function number_of_days() : int
55 {
56 return \intval($this->start->diff($this->end)->format('%a')) + 1;
57 }
58 protected function set_range(DateTime $start, DateTime $end, bool $convert_to_full_days)
59 {
60 $start = clone $start;
61 $end = clone $end;
62 if ($convert_to_full_days) {
63 $start = $this->start_of_locale_day($start);
64 $end = $this->end_of_locale_day($end);
65 }
66 $this->start = $start;
67 $this->end = $end;
68 }
69 /**
70 * Return the range size in days for previous period calculations
71 *
72 * @return int
73 */
74 private function range_size_in_days() : int
75 {
76 return $this->start->diff($this->end)->days + 1;
77 }
78 /**
79 * Return a new DateTime representing the start of the day in the users timezone
80 *
81 * @param DateTime $datetime
82 *
83 * @return DateTime
84 */
85 private function start_of_locale_day(\DateTime $datetime) : \DateTime
86 {
87 $datetime = clone $datetime;
88 return $datetime->setTimezone(Timezone::site_timezone())->setTime(0, 0, 0)->setTimezone(Timezone::utc_timezone());
89 }
90 /**
91 * Return a new DateTime representing the end of the day in the users timezone
92 *
93 * @param DateTime $datetime
94 *
95 * @return DateTime
96 */
97 private function end_of_locale_day(\DateTime $datetime) : \DateTime
98 {
99 $datetime = clone $datetime;
100 return $datetime->setTimezone(Timezone::site_timezone())->setTime(23, 59, 59)->setTimezone(Timezone::utc_timezone());
101 }
102 }
103