PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.12.2
Independent Analytics – WordPress Analytics Plugin v2.12.2
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 1 year ago Exact_Date_Range.php 1 year ago Relative_Date_Range.php 11 months ago
Date_Range.php
122 lines
1 <?php
2
3 namespace IAWP\Date_Range;
4
5 use DateTime;
6 use IAWP\Utils\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 /**
48 * TODO - Doesn't work well for units of varying size such as months
49 *
50 * @return Date_Range
51 */
52 public function previous_period() : \IAWP\Date_Range\Date_Range
53 {
54 $range_size = $this->range_size_in_days();
55 $previous_start = (clone $this->start)->modify("-{$range_size} days");
56 $previous_end = (clone $this->end)->modify("-{$range_size} days");
57 return new \IAWP\Date_Range\Exact_Date_Range($previous_start, $previous_end, \false);
58 }
59 /**
60 * TODO - Doesn't work well for units of varying size such as months
61 *
62 * @return Date_Range
63 */
64 public function next_period() : \IAWP\Date_Range\Date_Range
65 {
66 $range_size = $this->range_size_in_days();
67 $next_start = (clone $this->start)->modify("+{$range_size} days");
68 $next_end = (clone $this->end)->modify("+{$range_size} days");
69 return new \IAWP\Date_Range\Exact_Date_Range($next_start, $next_end, \false);
70 }
71 public function number_of_days() : int
72 {
73 return \intval($this->start->diff($this->end)->format('%a')) + 1;
74 }
75 protected function set_range(DateTime $start, DateTime $end, bool $convert_to_full_days)
76 {
77 $start = clone $start;
78 $end = clone $end;
79 if ($convert_to_full_days) {
80 $start = $this->start_of_locale_day($start);
81 $end = $this->end_of_locale_day($end);
82 }
83 $this->start = $start;
84 $this->end = $end;
85 }
86 /**
87 * Return the range size in days for previous period calculations
88 *
89 * TODO - Doesn't work well for units of varying size such as months
90 *
91 * @return int
92 */
93 private function range_size_in_days() : int
94 {
95 return $this->start->diff($this->end)->days + 1;
96 }
97 /**
98 * Return a new DateTime representing the start of the day in the users timezone
99 *
100 * @param DateTime $datetime
101 *
102 * @return DateTime
103 */
104 private function start_of_locale_day(\DateTime $datetime) : \DateTime
105 {
106 $datetime = clone $datetime;
107 return $datetime->setTimezone(Timezone::site_timezone())->setTime(0, 0, 0)->setTimezone(Timezone::utc_timezone());
108 }
109 /**
110 * Return a new DateTime representing the end of the day in the users timezone
111 *
112 * @param DateTime $datetime
113 *
114 * @return DateTime
115 */
116 private function end_of_locale_day(\DateTime $datetime) : \DateTime
117 {
118 $datetime = clone $datetime;
119 return $datetime->setTimezone(Timezone::site_timezone())->setTime(23, 59, 59)->setTimezone(Timezone::utc_timezone());
120 }
121 }
122