Merge branch 'MDL-41722-master' of git://github.com/sammarshallou/moodle
[moodle.git] / calendar / type / gregorian / classes / structure.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 namespace calendartype_gregorian;
18 use core_calendar\type_base;
20 /**
21  * Handles calendar functions for the gregorian calendar.
22  *
23  * @package calendartype_gregorian
24  * @copyright 2008 onwards Foodle Group {@link http://foodle.org}
25  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
27 class structure extends type_base {
29     /**
30      * Returns a list of all the possible days for all months.
31      *
32      * This is used to generate the select box for the days
33      * in the date selector elements. Some months contain more days
34      * than others so this function should return all possible days as
35      * we can not predict what month will be chosen (the user
36      * may have JS turned off and we need to support this situation in
37      * Moodle).
38      *
39      * @return array the days
40      */
41     public function get_days() {
42         $days = array();
44         for ($i = 1; $i <= 31; $i++) {
45             $days[$i] = $i;
46         }
48         return $days;
49     }
51     /**
52      * Returns a list of all the names of the months.
53      *
54      * @return array the month names
55      */
56     public function get_months() {
57         $months = array();
59         for ($i = 1; $i <= 12; $i++) {
60             $months[$i] = userdate(gmmktime(12, 0, 0, $i, 15, 2000), '%B');
61         }
63         return $months;
64     }
66     /**
67      * Returns the minimum year of the calendar.
68      *
69      * @return int the minumum year
70      */
71     public function get_min_year() {
72         return 1900;
73     }
75     /**
76      * Returns the maximum year of the calendar.
77      *
78      * @return int the max year
79      */
80     public function get_max_year() {
81         return 2050;
82     }
84     /**
85      * Returns a formatted string that represents a date in user time.
86      *
87      * Returns a formatted string that represents a date in user time
88      * <b>WARNING: note that the format is for strftime(), not date().</b>
89      * Because of a bug in most Windows time libraries, we can't use
90      * the nicer %e, so we have to use %d which has leading zeroes.
91      * A lot of the fuss in the function is just getting rid of these leading
92      * zeroes as efficiently as possible.
93      *
94      * If parameter fixday = true (default), then take off leading
95      * zero from %d, else maintain it.
96      *
97      * @param int $date the timestamp in UTC, as obtained from the database
98      * @param string $format strftime format
99      * @param int|float|string $timezone the timezone to use
100      *        {@link http://docs.moodle.org/dev/Time_API#Timezone}
101      * @param bool $fixday if true then the leading zero from %d is removed,
102      *        if false then the leading zero is maintained
103      * @param bool $fixhour if true then the leading zero from %I is removed,
104      *        if false then the leading zero is maintained
105      * @return string the formatted date/time
106      */
107     public function timestamp_to_date_string($date, $format, $timezone, $fixday, $fixhour) {
108         global $CFG;
110         if (empty($format)) {
111             $format = get_string('strftimedaydatetime', 'langconfig');
112         }
114         if (!empty($CFG->nofixday)) { // Config.php can force %d not to be fixed.
115             $fixday = false;
116         } else if ($fixday) {
117             $formatnoday = str_replace('%d', 'DD', $format);
118             $fixday = ($formatnoday != $format);
119             $format = $formatnoday;
120         }
122         // Note: This logic about fixing 12-hour time to remove unnecessary leading
123         // zero is required because on Windows, PHP strftime function does not
124         // support the correct 'hour without leading zero' parameter (%l).
125         if (!empty($CFG->nofixhour)) {
126             // Config.php can force %I not to be fixed.
127             $fixhour = false;
128         } else if ($fixhour) {
129             $formatnohour = str_replace('%I', 'HH', $format);
130             $fixhour = ($formatnohour != $format);
131             $format = $formatnohour;
132         }
134         // Add daylight saving offset for string timezones only, as we can't get dst for
135         // float values. if timezone is 99 (user default timezone), then try update dst.
136         if ((99 == $timezone) || !is_numeric($timezone)) {
137             $date += dst_offset_on($date, $timezone);
138         }
140         $timezone = get_user_timezone_offset($timezone);
142         // If we are running under Windows convert to windows encoding and then back to UTF-8
143         // (because it's impossible to specify UTF-8 to fetch locale info in Win32).
144         if (abs($timezone) > 13) { // Server time.
145             $datestring = date_format_string($date, $format, $timezone);
146             if ($fixday) {
147                 $daystring  = ltrim(str_replace(array(' 0', ' '), '', strftime(' %d', $date)));
148                 $datestring = str_replace('DD', $daystring, $datestring);
149             }
150             if ($fixhour) {
151                 $hourstring = ltrim(str_replace(array(' 0', ' '), '', strftime(' %I', $date)));
152                 $datestring = str_replace('HH', $hourstring, $datestring);
153             }
154         } else {
155             $date += (int)($timezone * 3600);
156             $datestring = date_format_string($date, $format, $timezone);
157             if ($fixday) {
158                 $daystring  = ltrim(str_replace(array(' 0', ' '), '', gmstrftime(' %d', $date)));
159                 $datestring = str_replace('DD', $daystring, $datestring);
160             }
161             if ($fixhour) {
162                 $hourstring = ltrim(str_replace(array(' 0', ' '), '', gmstrftime(' %I', $date)));
163                 $datestring = str_replace('HH', $hourstring, $datestring);
164             }
165         }
167         return $datestring;
168     }
170     /**
171      * Given a $time timestamp in GMT (seconds since epoch), returns an array that
172      * represents the date in user time.
173      *
174      * @param int $time Timestamp in GMT
175      * @param float|int|string $timezone offset's time with timezone, if float and not 99, then no
176      *        dst offset is applied {@link http://docs.moodle.org/dev/Time_API#Timezone}
177      * @return array an array that represents the date in user time
178      */
179     public function timestamp_to_date_array($time, $timezone) {
180         return usergetdate($time, $timezone);
181     }
183     /**
184      * Provided with a day, month, year, hour and minute in a specific
185      * calendar type convert it into the equivalent Gregorian date.
186      *
187      * In this function we don't need to do anything except pass the data
188      * back as an array. This is because the date received is Gregorian.
189      *
190      * @param int $year
191      * @param int $month
192      * @param int $day
193      * @param int $hour
194      * @param int $minute
195      * @return array the converted day, month, year, hour and minute.
196      */
197     public function convert_from_gregorian($year, $month, $day, $hour = 0, $minute = 0) {
198         $date = array();
199         $date['year'] = $year;
200         $date['month'] = $month;
201         $date['day'] = $day;
202         $date['hour'] = $hour;
203         $date['minute'] = $minute;
205         return $date;
206     }
208     /**
209      * Provided with a day, month, year, hour and minute in a specific
210      * calendar type convert it into the equivalent Gregorian date.
211      *
212      * In this function we don't need to do anything except pass the data
213      * back as an array. This is because the date received is Gregorian.
214      *
215      * @param int $year
216      * @param int $month
217      * @param int $day
218      * @param int $hour
219      * @param int $minute
220      * @return array the converted day, month, year, hour and minute.
221      */
222     public function convert_to_gregorian($year, $month, $day, $hour = 0, $minute = 0) {
223         $date = array();
224         $date['year'] = $year;
225         $date['month'] = $month;
226         $date['day'] = $day;
227         $date['hour'] = $hour;
228         $date['minute'] = $minute;
230         return $date;
231     }