source: sourcecode/system/helpers/date_helper.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 12.7 KB
Line 
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 */
38if ( ! 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 */
83if ( ! 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 */
110if ( ! 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 */
148if ( ! 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 */
265if ( ! 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 */
301if ( ! 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 */
327if ( ! 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 */
356if ( ! 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 */
393if ( ! 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 */
433if ( ! 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 */
504if ( ! 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 */
547if ( ! 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 */
Note: See TracBrowser for help on using the repository browser.