PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 1.30.0
Independent Analytics – WordPress Analytics Plugin v1.30.0
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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 3 years ago Relative_Date_Range.php 2 years ago
Date_Range.php
102 lines
1 <?php
2
3 namespace IAWP_SCOPED\IAWP\Date_Range;
4
5 use DateTime;
6 use IAWP_SCOPED\Proper\Timezone;
7 abstract class Date_Range
8 {
9 /**
10 * @var DateTime
11 */
12 protected $start;
13 /**
14 * @var DateTime
15 */
16 protected $end;
17 public abstract function label() : string;
18 /**
19 * @return DateTime
20 */
21 public function start() : DateTime
22 {
23 return $this->start;
24 }
25 /**
26 * @return string
27 */
28 public function iso_start() : string
29 {
30 return $this->start->format('Y-m-d\\TH:i:s');
31 }
32 /**
33 * @return DateTime
34 */
35 public function end() : DateTime
36 {
37 return $this->end;
38 }
39 /**
40 * @return string
41 */
42 public function iso_end() : string
43 {
44 return $this->end->format('Y-m-d\\TH:i:s');
45 }
46 public function previous_period() : Date_Range
47 {
48 $range_size = $this->range_size_in_days();
49 $previous_start = (clone $this->start)->modify("-{$range_size} days");
50 $previous_end = (clone $this->end)->modify("-{$range_size} days");
51 return new Exact_Date_Range($previous_start, $previous_end, \false);
52 }
53 public function number_of_days() : int
54 {
55 return \intval($this->start->diff($this->end)->format('%a')) + 1;
56 }
57 protected function set_range(DateTime $start, DateTime $end, bool $convert_to_full_days)
58 {
59 $start = clone $start;
60 $end = clone $end;
61 if ($convert_to_full_days) {
62 $start = $this->start_of_locale_day($start);
63 $end = $this->end_of_locale_day($end);
64 }
65 $this->start = $start;
66 $this->end = $end;
67 }
68 /**
69 * Return the range size in days for previous period calculations
70 *
71 * @return int
72 */
73 private function range_size_in_days() : int
74 {
75 return $this->start->diff($this->end)->days + 1;
76 }
77 /**
78 * Return a new DateTime representing the start of the day in the users timezone
79 *
80 * @param DateTime $datetime
81 *
82 * @return DateTime
83 */
84 private function start_of_locale_day(\DateTime $datetime) : \DateTime
85 {
86 $datetime = clone $datetime;
87 return $datetime->setTimezone(Timezone::site_timezone())->setTime(0, 0, 0)->setTimezone(Timezone::utc_timezone());
88 }
89 /**
90 * Return a new DateTime representing the end of the day in the users timezone
91 *
92 * @param DateTime $datetime
93 *
94 * @return DateTime
95 */
96 private function end_of_locale_day(\DateTime $datetime) : \DateTime
97 {
98 $datetime = clone $datetime;
99 return $datetime->setTimezone(Timezone::site_timezone())->setTime(23, 59, 59)->setTimezone(Timezone::utc_timezone());
100 }
101 }
102