user gets notified interatively or by email in case of a CIS error
[living-lab-site.git] / system / helpers / date_helper.php
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:%m:%i 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 */