]>
Commit | Line | Data |
---|---|---|
59c06b17 CS |
1 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
2 | /** | |
3 | * CodeIgniter | |
4 | * | |
5 | * An open source application development framework for PHP 5.1.6 or newer | |
6 | * | |
7 | * @package CodeIgniter | |
8 | * @author ExpressionEngine Dev Team | |
9 | * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. | |
10 | * @license http://codeigniter.com/user_guide/license.html | |
11 | * @link http://codeigniter.com | |
12 | * @since Version 1.0 | |
13 | * @filesource | |
14 | */ | |
15 | ||
16 | // ------------------------------------------------------------------------ | |
17 | ||
18 | /** | |
19 | * CodeIgniter Date Helpers | |
20 | * | |
21 | * @package CodeIgniter | |
22 | * @subpackage Helpers | |
23 | * @category Helpers | |
24 | * @author ExpressionEngine Dev Team | |
25 | * @link http://codeigniter.com/user_guide/helpers/date_helper.html | |
26 | */ | |
27 | ||
28 | // ------------------------------------------------------------------------ | |
29 | ||
30 | /** | |
31 | * Get "now" time | |
32 | * | |
33 | * Returns time() or its GMT equivalent based on the config file preference | |
34 | * | |
35 | * @access public | |
36 | * @return integer | |
37 | */ | |
38 | if ( ! function_exists('now')) | |
39 | { | |
40 | function now() | |
41 | { | |
42 | $CI =& get_instance(); | |
43 | ||
44 | if (strtolower($CI->config->item('time_reference')) == 'gmt') | |
45 | { | |
46 | $now = time(); | |
47 | $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); | |
48 | ||
49 | if (strlen($system_time) < 10) | |
50 | { | |
51 | $system_time = time(); | |
52 | log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.'); | |
53 | } | |
54 | ||
55 | return $system_time; | |
56 | } | |
57 | else | |
58 | { | |
59 | return time(); | |
60 | } | |
61 | } | |
62 | } | |
63 | ||
64 | // ------------------------------------------------------------------------ | |
65 | ||
66 | /** | |
67 | * Convert MySQL Style Datecodes | |
68 | * | |
69 | * This function is identical to PHPs date() function, | |
70 | * except that it allows date codes to be formatted using | |
71 | * the MySQL style, where each code letter is preceded | |
72 | * with a percent sign: %Y %m %d etc... | |
73 | * | |
74 | * The benefit of doing dates this way is that you don't | |
75 | * have to worry about escaping your text letters that | |
76 | * match the date codes. | |
77 | * | |
78 | * @access public | |
79 | * @param string | |
80 | * @param integer | |
81 | * @return integer | |
82 | */ | |
83 | if ( ! function_exists('mdate')) | |
84 | { | |
85 | function mdate($datestr = '', $time = '') | |
86 | { | |
87 | if ($datestr == '') | |
88 | return ''; | |
89 | ||
90 | if ($time == '') | |
91 | $time = now(); | |
92 | ||
93 | $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr)); | |
94 | return date($datestr, $time); | |
95 | } | |
96 | } | |
97 | ||
98 | // ------------------------------------------------------------------------ | |
99 | ||
100 | /** | |
101 | * Standard Date | |
102 | * | |
103 | * Returns a date formatted according to the submitted standard. | |
104 | * | |
105 | * @access public | |
106 | * @param string the chosen format | |
107 | * @param integer Unix timestamp | |
108 | * @return string | |
109 | */ | |
110 | if ( ! function_exists('standard_date')) | |
111 | { | |
112 | function standard_date($fmt = 'DATE_RFC822', $time = '') | |
113 | { | |
114 | $formats = array( | |
115 | 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q', | |
116 | 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', | |
117 | 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%Q', | |
118 | 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O', | |
119 | 'DATE_RFC850' => '%l, %d-%M-%y %H:%i:%s UTC', | |
120 | 'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O', | |
121 | 'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O', | |
122 | 'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O', | |
123 | 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q' | |
124 | ); | |
125 | ||
126 | if ( ! isset($formats[$fmt])) | |
127 | { | |
128 | return FALSE; | |
129 | } | |
130 | ||
131 | return mdate($formats[$fmt], $time); | |
132 | } | |
133 | } | |
134 | ||
135 | // ------------------------------------------------------------------------ | |
136 | ||
137 | /** | |
138 | * Timespan | |
139 | * | |
140 | * Returns a span of seconds in this format: | |
141 | * 10 days 14 hours 36 minutes 47 seconds | |
142 | * | |
143 | * @access public | |
144 | * @param integer a number of seconds | |
145 | * @param integer Unix timestamp | |
146 | * @return integer | |
147 | */ | |
148 | if ( ! function_exists('timespan')) | |
149 | { | |
150 | function timespan($seconds = 1, $time = '') | |
151 | { | |
152 | $CI =& get_instance(); | |
153 | $CI->lang->load('date'); | |
154 | ||
155 | if ( ! is_numeric($seconds)) | |
156 | { | |
157 | $seconds = 1; | |
158 | } | |
159 | ||
160 | if ( ! is_numeric($time)) | |
161 | { | |
162 | $time = time(); | |
163 | } | |
164 | ||
165 | if ($time <= $seconds) | |
166 | { | |
167 | $seconds = 1; | |
168 | } | |
169 | else | |
170 | { | |
171 | $seconds = $time - $seconds; | |
172 | } | |
173 | ||
174 | $str = ''; | |
175 | $years = floor($seconds / 31536000); | |
176 | ||
177 | if ($years > 0) | |
178 | { | |
179 | $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', '; | |
180 | } | |
181 | ||
182 | $seconds -= $years * 31536000; | |
183 | $months = floor($seconds / 2628000); | |
184 | ||
185 | if ($years > 0 OR $months > 0) | |
186 | { | |
187 | if ($months > 0) | |
188 | { | |
189 | $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', '; | |
190 | } | |
191 | ||
192 | $seconds -= $months * 2628000; | |
193 | } | |
194 | ||
195 | $weeks = floor($seconds / 604800); | |
196 | ||
197 | if ($years > 0 OR $months > 0 OR $weeks > 0) | |
198 | { | |
199 | if ($weeks > 0) | |
200 | { | |
201 | $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', '; | |
202 | } | |
203 | ||
204 | $seconds -= $weeks * 604800; | |
205 | } | |
206 | ||
207 | $days = floor($seconds / 86400); | |
208 | ||
209 | if ($months > 0 OR $weeks > 0 OR $days > 0) | |
210 | { | |
211 | if ($days > 0) | |
212 | { | |
213 | $str .= $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')).', '; | |
214 | } | |
215 | ||
216 | $seconds -= $days * 86400; | |
217 | } | |
218 | ||
219 | $hours = floor($seconds / 3600); | |
220 | ||
221 | if ($days > 0 OR $hours > 0) | |
222 | { | |
223 | if ($hours > 0) | |
224 | { | |
225 | $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', '; | |
226 | } | |
227 | ||
228 | $seconds -= $hours * 3600; | |
229 | } | |
230 | ||
231 | $minutes = floor($seconds / 60); | |
232 | ||
233 | if ($days > 0 OR $hours > 0 OR $minutes > 0) | |
234 | { | |
235 | if ($minutes > 0) | |
236 | { | |
237 | $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', '; | |
238 | } | |
239 | ||
240 | $seconds -= $minutes * 60; | |
241 | } | |
242 | ||
243 | if ($str == '') | |
244 | { | |
245 | $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', '; | |
246 | } | |
247 | ||
248 | return substr(trim($str), 0, -1); | |
249 | } | |
250 | } | |
251 | ||
252 | // ------------------------------------------------------------------------ | |
253 | ||
254 | /** | |
255 | * Number of days in a month | |
256 | * | |
257 | * Takes a month/year as input and returns the number of days | |
258 | * for the given month/year. Takes leap years into consideration. | |
259 | * | |
260 | * @access public | |
261 | * @param integer a numeric month | |
262 | * @param integer a numeric year | |
263 | * @return integer | |
264 | */ | |
265 | if ( ! function_exists('days_in_month')) | |
266 | { | |
267 | function days_in_month($month = 0, $year = '') | |
268 | { | |
269 | if ($month < 1 OR $month > 12) | |
270 | { | |
271 | return 0; | |
272 | } | |
273 | ||
274 | if ( ! is_numeric($year) OR strlen($year) != 4) | |
275 | { | |
276 | $year = date('Y'); | |
277 | } | |
278 | ||
279 | if ($month == 2) | |
280 | { | |
281 | if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) | |
282 | { | |
283 | return 29; | |
284 | } | |
285 | } | |
286 | ||
287 | $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); | |
288 | return $days_in_month[$month - 1]; | |
289 | } | |
290 | } | |
291 | ||
292 | // ------------------------------------------------------------------------ | |
293 | ||
294 | /** | |
295 | * Converts a local Unix timestamp to GMT | |
296 | * | |
297 | * @access public | |
298 | * @param integer Unix timestamp | |
299 | * @return integer | |
300 | */ | |
301 | if ( ! function_exists('local_to_gmt')) | |
302 | { | |
303 | function local_to_gmt($time = '') | |
304 | { | |
305 | if ($time == '') | |
306 | $time = time(); | |
307 | ||
308 | return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time)); | |
309 | } | |
310 | } | |
311 | ||
312 | // ------------------------------------------------------------------------ | |
313 | ||
314 | /** | |
315 | * Converts GMT time to a localized value | |
316 | * | |
317 | * Takes a Unix timestamp (in GMT) as input, and returns | |
318 | * at the local value based on the timezone and DST setting | |
319 | * submitted | |
320 | * | |
321 | * @access public | |
322 | * @param integer Unix timestamp | |
323 | * @param string timezone | |
324 | * @param bool whether DST is active | |
325 | * @return integer | |
326 | */ | |
327 | if ( ! function_exists('gmt_to_local')) | |
328 | { | |
329 | function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) | |
330 | { | |
331 | if ($time == '') | |
332 | { | |
333 | return now(); | |
334 | } | |
335 | ||
336 | $time += timezones($timezone) * 3600; | |
337 | ||
338 | if ($dst == TRUE) | |
339 | { | |
340 | $time += 3600; | |
341 | } | |
342 | ||
343 | return $time; | |
344 | } | |
345 | } | |
346 | ||
347 | // ------------------------------------------------------------------------ | |
348 | ||
349 | /** | |
350 | * Converts a MySQL Timestamp to Unix | |
351 | * | |
352 | * @access public | |
353 | * @param integer Unix timestamp | |
354 | * @return integer | |
355 | */ | |
356 | if ( ! function_exists('mysql_to_unix')) | |
357 | { | |
358 | function mysql_to_unix($time = '') | |
359 | { | |
360 | // We'll remove certain characters for backward compatibility | |
361 | // since the formatting changed with MySQL 4.1 | |
362 | // YYYY-MM-DD HH:MM:SS | |
363 | ||
364 | $time = str_replace('-', '', $time); | |
365 | $time = str_replace(':', '', $time); | |
366 | $time = str_replace(' ', '', $time); | |
367 | ||
368 | // YYYYMMDDHHMMSS | |
369 | return mktime( | |
370 | substr($time, 8, 2), | |
371 | substr($time, 10, 2), | |
372 | substr($time, 12, 2), | |
373 | substr($time, 4, 2), | |
374 | substr($time, 6, 2), | |
375 | substr($time, 0, 4) | |
376 | ); | |
377 | } | |
378 | } | |
379 | ||
380 | // ------------------------------------------------------------------------ | |
381 | ||
382 | /** | |
383 | * Unix to "Human" | |
384 | * | |
385 | * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM | |
386 | * | |
387 | * @access public | |
388 | * @param integer Unix timestamp | |
389 | * @param bool whether to show seconds | |
390 | * @param string format: us or euro | |
391 | * @return string | |
392 | */ | |
393 | if ( ! function_exists('unix_to_human')) | |
394 | { | |
395 | function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') | |
396 | { | |
397 | $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; | |
398 | ||
399 | if ($fmt == 'us') | |
400 | { | |
401 | $r .= date('h', $time).':'.date('i', $time); | |
402 | } | |
403 | else | |
404 | { | |
405 | $r .= date('H', $time).':'.date('i', $time); | |
406 | } | |
407 | ||
408 | if ($seconds) | |
409 | { | |
410 | $r .= ':'.date('s', $time); | |
411 | } | |
412 | ||
413 | if ($fmt == 'us') | |
414 | { | |
415 | $r .= ' '.date('A', $time); | |
416 | } | |
417 | ||
418 | return $r; | |
419 | } | |
420 | } | |
421 | ||
422 | // ------------------------------------------------------------------------ | |
423 | ||
424 | /** | |
425 | * Convert "human" date to GMT | |
426 | * | |
427 | * Reverses the above process | |
428 | * | |
429 | * @access public | |
430 | * @param string format: us or euro | |
431 | * @return integer | |
432 | */ | |
433 | if ( ! function_exists('human_to_unix')) | |
434 | { | |
435 | function human_to_unix($datestr = '') | |
436 | { | |
437 | if ($datestr == '') | |
438 | { | |
439 | return FALSE; | |
440 | } | |
441 | ||
442 | $datestr = trim($datestr); | |
443 | $datestr = preg_replace("/\040+/", ' ', $datestr); | |
444 | ||
445 | if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) | |
446 | { | |
447 | return FALSE; | |
448 | } | |
449 | ||
450 | $split = explode(' ', $datestr); | |
451 | ||
452 | $ex = explode("-", $split['0']); | |
453 | ||
454 | $year = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0']; | |
455 | $month = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; | |
456 | $day = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; | |
457 | ||
458 | $ex = explode(":", $split['1']); | |
459 | ||
460 | $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0']; | |
461 | $min = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; | |
462 | ||
463 | if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) | |
464 | { | |
465 | $sec = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; | |
466 | } | |
467 | else | |
468 | { | |
469 | // Unless specified, seconds get set to zero. | |
470 | $sec = '00'; | |
471 | } | |
472 | ||
473 | if (isset($split['2'])) | |
474 | { | |
475 | $ampm = strtolower($split['2']); | |
476 | ||
477 | if (substr($ampm, 0, 1) == 'p' AND $hour < 12) | |
478 | $hour = $hour + 12; | |
479 | ||
480 | if (substr($ampm, 0, 1) == 'a' AND $hour == 12) | |
481 | $hour = '00'; | |
482 | ||
483 | if (strlen($hour) == 1) | |
484 | $hour = '0'.$hour; | |
485 | } | |
486 | ||
487 | return mktime($hour, $min, $sec, $month, $day, $year); | |
488 | } | |
489 | } | |
490 | ||
491 | // ------------------------------------------------------------------------ | |
492 | ||
493 | /** | |
494 | * Timezone Menu | |
495 | * | |
496 | * Generates a drop-down menu of timezones. | |
497 | * | |
498 | * @access public | |
499 | * @param string timezone | |
500 | * @param string classname | |
501 | * @param string menu name | |
502 | * @return string | |
503 | */ | |
504 | if ( ! function_exists('timezone_menu')) | |
505 | { | |
506 | function timezone_menu($default = 'UTC', $class = "", $name = 'timezones') | |
507 | { | |
508 | $CI =& get_instance(); | |
509 | $CI->lang->load('date'); | |
510 | ||
511 | if ($default == 'GMT') | |
512 | $default = 'UTC'; | |
513 | ||
514 | $menu = '<select name="'.$name.'"'; | |
515 | ||
516 | if ($class != '') | |
517 | { | |
518 | $menu .= ' class="'.$class.'"'; | |
519 | } | |
520 | ||
521 | $menu .= ">\n"; | |
522 | ||
523 | foreach (timezones() as $key => $val) | |
524 | { | |
525 | $selected = ($default == $key) ? " selected='selected'" : ''; | |
526 | $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n"; | |
527 | } | |
528 | ||
529 | $menu .= "</select>"; | |
530 | ||
531 | return $menu; | |
532 | } | |
533 | } | |
534 | ||
535 | // ------------------------------------------------------------------------ | |
536 | ||
537 | /** | |
538 | * Timezones | |
539 | * | |
540 | * Returns an array of timezones. This is a helper function | |
541 | * for various other ones in this library | |
542 | * | |
543 | * @access public | |
544 | * @param string timezone | |
545 | * @return string | |
546 | */ | |
547 | if ( ! function_exists('timezones')) | |
548 | { | |
549 | function timezones($tz = '') | |
550 | { | |
551 | // Note: Don't change the order of these even though | |
552 | // some items appear to be in the wrong order | |
553 | ||
554 | $zones = array( | |
555 | 'UM12' => -12, | |
556 | 'UM11' => -11, | |
557 | 'UM10' => -10, | |
558 | 'UM95' => -9.5, | |
559 | 'UM9' => -9, | |
560 | 'UM8' => -8, | |
561 | 'UM7' => -7, | |
562 | 'UM6' => -6, | |
563 | 'UM5' => -5, | |
564 | 'UM45' => -4.5, | |
565 | 'UM4' => -4, | |
566 | 'UM35' => -3.5, | |
567 | 'UM3' => -3, | |
568 | 'UM2' => -2, | |
569 | 'UM1' => -1, | |
570 | 'UTC' => 0, | |
571 | 'UP1' => +1, | |
572 | 'UP2' => +2, | |
573 | 'UP3' => +3, | |
574 | 'UP35' => +3.5, | |
575 | 'UP4' => +4, | |
576 | 'UP45' => +4.5, | |
577 | 'UP5' => +5, | |
578 | 'UP55' => +5.5, | |
579 | 'UP575' => +5.75, | |
580 | 'UP6' => +6, | |
581 | 'UP65' => +6.5, | |
582 | 'UP7' => +7, | |
583 | 'UP8' => +8, | |
584 | 'UP875' => +8.75, | |
585 | 'UP9' => +9, | |
586 | 'UP95' => +9.5, | |
587 | 'UP10' => +10, | |
588 | 'UP105' => +10.5, | |
589 | 'UP11' => +11, | |
590 | 'UP115' => +11.5, | |
591 | 'UP12' => +12, | |
592 | 'UP1275' => +12.75, | |
593 | 'UP13' => +13, | |
594 | 'UP14' => +14 | |
595 | ); | |
596 | ||
597 | if ($tz == '') | |
598 | { | |
599 | return $zones; | |
600 | } | |
601 | ||
602 | if ($tz == 'GMT') | |
603 | $tz = 'UTC'; | |
604 | ||
605 | return ( ! isset($zones[$tz])) ? 0 : $zones[$tz]; | |
606 | } | |
607 | } | |
608 | ||
609 | ||
610 | /* End of file date_helper.php */ | |
611 | /* Location: ./system/helpers/date_helper.php */ |