converted to unix-style eol
[www-register-wizard.git] / helpers / date_helper.php
index c9c8968..dbd7e0e 100644 (file)
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package            CodeIgniter\r
- * @author             ExpressionEngine Dev Team\r
- * @copyright  Copyright (c) 2008, EllisLab, Inc.\r
- * @license            http://codeigniter.com/user_guide/license.html\r
- * @link               http://codeigniter.com\r
- * @since              Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Date Helpers\r
- *\r
- * @package            CodeIgniter\r
- * @subpackage Helpers\r
- * @category   Helpers\r
- * @author             ExpressionEngine Dev Team\r
- * @link               http://codeigniter.com/user_guide/helpers/date_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Get "now" time\r
- *\r
- * Returns time() or its GMT equivalent based on the config file preference\r
- *\r
- * @access     public\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('now'))\r
-{\r
-       function now()\r
-       {\r
-               $CI =& get_instance();\r
-       \r
-               if (strtolower($CI->config->item('time_reference')) == 'gmt')\r
-               {\r
-                       $now = time();\r
-                       $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));\r
-       \r
-                       if (strlen($system_time) < 10)\r
-                       {\r
-                               $system_time = time();\r
-                               log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.');\r
-                       }\r
-       \r
-                       return $system_time;\r
-               }\r
-               else\r
-               {\r
-                       return time();\r
-               }\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert MySQL Style Datecodes\r
- *\r
- * This function is identical to PHPs date() function,\r
- * except that it allows date codes to be formatted using\r
- * the MySQL style, where each code letter is preceded\r
- * with a percent sign:  %Y %m %d etc...\r
- *\r
- * The benefit of doing dates this way is that you don't\r
- * have to worry about escaping your text letters that\r
- * match the date codes.\r
- *\r
- * @access     public\r
- * @param      string\r
- * @param      integer\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('mdate'))\r
-{\r
-       function mdate($datestr = '', $time = '')\r
-       {\r
-               if ($datestr == '')\r
-                       return '';\r
-       \r
-               if ($time == '')\r
-                       $time = now();\r
-               \r
-               $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr));\r
-               return date($datestr, $time);\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Standard Date\r
- *\r
- * Returns a date formatted according to the submitted standard.\r
- *\r
- * @access     public\r
- * @param      string  the chosen format\r
- * @param      integer Unix timestamp\r
- * @return     string\r
- */    \r
-if ( ! function_exists('standard_date'))\r
-{\r
-       function standard_date($fmt = 'DATE_RFC822', $time = '')\r
-       {\r
-               $formats = array(\r
-                                               'DATE_ATOM'             =>      '%Y-%m-%dT%H:%i:%s%Q',\r
-                                               'DATE_COOKIE'   =>      '%l, %d-%M-%y %H:%i:%s UTC',\r
-                                               'DATE_ISO8601'  =>      '%Y-%m-%dT%H:%i:%s%O',\r
-                                               'DATE_RFC822'   =>      '%D, %d %M %y %H:%i:%s %O',\r
-                                               'DATE_RFC850'   =>      '%l, %d-%M-%y %H:%m:%i UTC',\r
-                                               'DATE_RFC1036'  =>      '%D, %d %M %y %H:%i:%s %O',\r
-                                               'DATE_RFC1123'  =>      '%D, %d %M %Y %H:%i:%s %O',\r
-                                               'DATE_RSS'              =>      '%D, %d %M %Y %H:%i:%s %O',\r
-                                               'DATE_W3C'              =>      '%Y-%m-%dT%H:%i:%s%Q'\r
-                                               );\r
-\r
-               if ( ! isset($formats[$fmt]))\r
-               {\r
-                       return FALSE;\r
-               }\r
-       \r
-               return mdate($formats[$fmt], $time);\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timespan\r
- *\r
- * Returns a span of seconds in this format:\r
- *     10 days 14 hours 36 minutes 47 seconds\r
- *\r
- * @access     public\r
- * @param      integer a number of seconds\r
- * @param      integer Unix timestamp\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('timespan'))\r
-{\r
-       function timespan($seconds = 1, $time = '')\r
-       {\r
-               $CI =& get_instance();\r
-               $CI->lang->load('date');\r
-\r
-               if ( ! is_numeric($seconds))\r
-               {\r
-                       $seconds = 1;\r
-               }\r
-       \r
-               if ( ! is_numeric($time))\r
-               {\r
-                       $time = time();\r
-               }\r
-       \r
-               if ($time <= $seconds)\r
-               {\r
-                       $seconds = 1;\r
-               }\r
-               else\r
-               {\r
-                       $seconds = $time - $seconds;\r
-               }\r
-               \r
-               $str = '';\r
-               $years = floor($seconds / 31536000);\r
-       \r
-               if ($years > 0)\r
-               {       \r
-                       $str .= $years.' '.$CI->lang->line((($years     > 1) ? 'date_years' : 'date_year')).', ';\r
-               }       \r
-       \r
-               $seconds -= $years * 31536000;\r
-               $months = floor($seconds / 2628000);\r
-       \r
-               if ($years > 0 OR $months > 0)\r
-               {\r
-                       if ($months > 0)\r
-                       {       \r
-                               $str .= $months.' '.$CI->lang->line((($months   > 1) ? 'date_months' : 'date_month')).', ';\r
-                       }       \r
-       \r
-                       $seconds -= $months * 2628000;\r
-               }\r
-\r
-               $weeks = floor($seconds / 604800);\r
-       \r
-               if ($years > 0 OR $months > 0 OR $weeks > 0)\r
-               {\r
-                       if ($weeks > 0)\r
-                       {       \r
-                               $str .= $weeks.' '.$CI->lang->line((($weeks     > 1) ? 'date_weeks' : 'date_week')).', ';\r
-                       }\r
-               \r
-                       $seconds -= $weeks * 604800;\r
-               }                       \r
-\r
-               $days = floor($seconds / 86400);\r
-       \r
-               if ($months > 0 OR $weeks > 0 OR $days > 0)\r
-               {\r
-                       if ($days > 0)\r
-                       {       \r
-                               $str .= $days.' '.$CI->lang->line((($days       > 1) ? 'date_days' : 'date_day')).', ';\r
-                       }\r
-       \r
-                       $seconds -= $days * 86400;\r
-               }\r
-       \r
-               $hours = floor($seconds / 3600);\r
-       \r
-               if ($days > 0 OR $hours > 0)\r
-               {\r
-                       if ($hours > 0)\r
-                       {\r
-                               $str .= $hours.' '.$CI->lang->line((($hours     > 1) ? 'date_hours' : 'date_hour')).', ';\r
-                       }\r
-               \r
-                       $seconds -= $hours * 3600;\r
-               }\r
-       \r
-               $minutes = floor($seconds / 60);\r
-       \r
-               if ($days > 0 OR $hours > 0 OR $minutes > 0)\r
-               {\r
-                       if ($minutes > 0)\r
-                       {       \r
-                               $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', ';\r
-                       }\r
-               \r
-                       $seconds -= $minutes * 60;\r
-               }\r
-       \r
-               if ($str == '')\r
-               {\r
-                       $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', ';\r
-               }\r
-                       \r
-               return substr(trim($str), 0, -1);\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Number of days in a month\r
- *\r
- * Takes a month/year as input and returns the number of days\r
- * for the given month/year. Takes leap years into consideration.\r
- *\r
- * @access     public\r
- * @param      integer a numeric month\r
- * @param      integer a numeric year\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('days_in_month'))\r
-{\r
-       function days_in_month($month = 0, $year = '')\r
-       {\r
-               if ($month < 1 OR $month > 12)\r
-               {\r
-                       return 0;\r
-               }\r
-       \r
-               if ( ! is_numeric($year) OR strlen($year) != 4)\r
-               {\r
-                       $year = date('Y');\r
-               }\r
-       \r
-               if ($month == 2)\r
-               {\r
-                       if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))\r
-                       {\r
-                               return 29;\r
-                       }\r
-               }\r
-\r
-               $days_in_month  = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);\r
-               return $days_in_month[$month - 1];\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts a local Unix timestamp to GMT\r
- *\r
- * @access     public\r
- * @param      integer Unix timestamp\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('local_to_gmt'))\r
-{\r
-       function local_to_gmt($time = '')\r
-       {\r
-               if ($time == '')\r
-                       $time = time();\r
-       \r
-               return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time));\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts GMT time to a localized value\r
- *\r
- * Takes a Unix timestamp (in GMT) as input, and returns\r
- * at the local value based on the timezone and DST setting\r
- * submitted\r
- *\r
- * @access     public\r
- * @param      integer Unix timestamp\r
- * @param      string  timezone\r
- * @param      bool    whether DST is active\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('gmt_to_local'))\r
-{\r
-       function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)\r
-       {                       \r
-               if ($time == '')\r
-               {\r
-                       return now();\r
-               }\r
-       \r
-               $time += timezones($timezone) * 3600;\r
-\r
-               if ($dst == TRUE)\r
-               {\r
-                       $time += 3600;\r
-               }\r
-       \r
-               return $time;\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts a MySQL Timestamp to Unix\r
- *\r
- * @access     public\r
- * @param      integer Unix timestamp\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('mysql_to_unix'))\r
-{\r
-       function mysql_to_unix($time = '')\r
-       {\r
-               // We'll remove certain characters for backward compatibility\r
-               // since the formatting changed with MySQL 4.1\r
-               // YYYY-MM-DD HH:MM:SS\r
-       \r
-               $time = str_replace('-', '', $time);\r
-               $time = str_replace(':', '', $time);\r
-               $time = str_replace(' ', '', $time);\r
-       \r
-               // YYYYMMDDHHMMSS\r
-               return  mktime(\r
-                                               substr($time, 8, 2),\r
-                                               substr($time, 10, 2),\r
-                                               substr($time, 12, 2),\r
-                                               substr($time, 4, 2),\r
-                                               substr($time, 6, 2),\r
-                                               substr($time, 0, 4)\r
-                                               );\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Unix to "Human"\r
- *\r
- * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM\r
- *\r
- * @access     public\r
- * @param      integer Unix timestamp\r
- * @param      bool    whether to show seconds\r
- * @param      string  format: us or euro\r
- * @return     string\r
- */    \r
-if ( ! function_exists('unix_to_human'))\r
-{\r
-       function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')\r
-       {\r
-               $r  = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' ';\r
-               \r
-               if ($fmt == 'us')\r
-               {\r
-                       $r .= date('h', $time).':'.date('i', $time);\r
-               }\r
-               else\r
-               {\r
-                       $r .= date('H', $time).':'.date('i', $time);\r
-               }\r
-       \r
-               if ($seconds)\r
-               {\r
-                       $r .= ':'.date('s', $time);\r
-               }\r
-       \r
-               if ($fmt == 'us')\r
-               {\r
-                       $r .= ' '.date('A', $time);\r
-               }\r
-               \r
-               return $r;\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert "human" date to GMT\r
- *\r
- * Reverses the above process\r
- *\r
- * @access     public\r
- * @param      string  format: us or euro\r
- * @return     integer\r
- */    \r
-if ( ! function_exists('human_to_unix'))\r
-{\r
-       function human_to_unix($datestr = '')\r
-       {\r
-               if ($datestr == '')\r
-               {\r
-                       return FALSE;\r
-               }\r
-       \r
-               $datestr = trim($datestr);\r
-               $datestr = preg_replace("/\040+/", "\040", $datestr);\r
-\r
-               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))\r
-               {\r
-                       return FALSE;\r
-               }\r
-\r
-               $split = preg_split("/\040/", $datestr);\r
-\r
-               $ex = explode("-", $split['0']);\r
-       \r
-               $year  = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0'];\r
-               $month = (strlen($ex['1']) == 1) ? '0'.$ex['1']  : $ex['1'];\r
-               $day   = (strlen($ex['2']) == 1) ? '0'.$ex['2']  : $ex['2'];\r
-\r
-               $ex = explode(":", $split['1']);\r
-       \r
-               $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0'];\r
-               $min  = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];\r
-\r
-               if (isset($ex['2']) AND ereg("[0-9]{1,2}", $ex['2']))\r
-               {\r
-                       $sec  = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];\r
-               }\r
-               else\r
-               {\r
-                       // Unless specified, seconds get set to zero.\r
-                       $sec = '00';\r
-               }\r
-       \r
-               if (isset($split['2']))\r
-               {\r
-                       $ampm = strtolower($split['2']);\r
-               \r
-                       if (substr($ampm, 0, 1) == 'p' AND $hour < 12)\r
-                               $hour = $hour + 12;\r
-                       \r
-                       if (substr($ampm, 0, 1) == 'a' AND $hour == 12)\r
-                               $hour =  '00';\r
-                       \r
-                       if (strlen($hour) == 1)\r
-                               $hour = '0'.$hour;\r
-               }\r
-                       \r
-               return mktime($hour, $min, $sec, $month, $day, $year);\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timezone Menu\r
- *\r
- * Generates a drop-down menu of timezones.\r
- *\r
- * @access     public\r
- * @param      string  timezone\r
- * @param      string  classname\r
- * @param      string  menu name\r
- * @return     string\r
- */    \r
-if ( ! function_exists('timezone_menu'))\r
-{\r
-       function timezone_menu($default = 'UTC', $class = "", $name = 'timezones')\r
-       {\r
-               $CI =& get_instance();\r
-               $CI->lang->load('date');\r
-       \r
-               if ($default == 'GMT')\r
-                       $default = 'UTC';\r
-\r
-               $menu = '<select name="'.$name.'"';\r
-       \r
-               if ($class != '')\r
-               {\r
-                       $menu .= ' class="'.$class.'"';\r
-               }\r
-       \r
-               $menu .= ">\n";\r
-       \r
-               foreach (timezones() as $key => $val)\r
-               {\r
-                       $selected = ($default == $key) ? " selected='selected'" : '';\r
-                       $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n";\r
-               }\r
-\r
-               $menu .= "</select>";\r
-\r
-               return $menu;\r
-       }\r
-}\r
-       \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timezones\r
- *\r
- * Returns an array of timezones.  This is a helper function\r
- * for various other ones in this library\r
- *\r
- * @access     public\r
- * @param      string  timezone\r
- * @return     string\r
- */    \r
-if ( ! function_exists('timezones'))\r
-{\r
-       function timezones($tz = '')\r
-       {\r
-               // Note: Don't change the order of these even though\r
-               // some items appear to be in the wrong order\r
-               \r
-               $zones = array( \r
-                                               'UM12'          => -12,\r
-                                               'UM11'          => -11,\r
-                                               'UM10'          => -10,\r
-                                               'UM95'          => -9.5,\r
-                                               'UM9'           => -9,\r
-                                               'UM8'           => -8,\r
-                                               'UM7'           => -7,\r
-                                               'UM6'           => -6,\r
-                                               'UM5'           => -5,\r
-                                               'UM45'          => -4.5,\r
-                                               'UM4'           => -4,\r
-                                               'UM35'          => -3.5,\r
-                                               'UM3'           => -3,\r
-                                               'UM2'           => -2,\r
-                                               'UM1'           => -1,\r
-                                               'UTC'           => 0,\r
-                                               'UP1'           => +1,\r
-                                               'UP2'           => +2,\r
-                                               'UP3'           => +3,\r
-                                               'UP35'          => +3.5,\r
-                                               'UP4'           => +4,\r
-                                               'UP45'          => +4.5,\r
-                                               'UP5'           => +5,\r
-                                               'UP55'          => +5.5,\r
-                                               'UP575'         => +5.75,\r
-                                               'UP6'           => +6,\r
-                                               'UP65'          => +6.5,\r
-                                               'UP7'           => +7,\r
-                                               'UP8'           => +8,\r
-                                               'UP875'         => +8.75,\r
-                                               'UP9'           => +9,\r
-                                               'UP95'          => +9.5,\r
-                                               'UP10'          => +10,\r
-                                               'UP105'         => +10.5,\r
-                                               'UP11'          => +11,\r
-                                               'UP115'         => +11.5,\r
-                                               'UP12'          => +12,\r
-                                               'UP1275'        => +12.75,\r
-                                               'UP13'          => +13,\r
-                                               'UP14'          => +14\r
-                                       );\r
-                               \r
-               if ($tz == '')\r
-               {\r
-                       return $zones;\r
-               }\r
-       \r
-               if ($tz == 'GMT')\r
-                       $tz = 'UTC';\r
-       \r
-               return ( ! isset($zones[$tz])) ? 0 : $zones[$tz];\r
-       }\r
-}\r
-\r
-\r
-/* End of file date_helper.php */\r
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package            CodeIgniter
+ * @author             ExpressionEngine Dev Team
+ * @copyright  Copyright (c) 2008, EllisLab, Inc.
+ * @license            http://codeigniter.com/user_guide/license.html
+ * @link               http://codeigniter.com
+ * @since              Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Date Helpers
+ *
+ * @package            CodeIgniter
+ * @subpackage Helpers
+ * @category   Helpers
+ * @author             ExpressionEngine Dev Team
+ * @link               http://codeigniter.com/user_guide/helpers/date_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Get "now" time
+ *
+ * Returns time() or its GMT equivalent based on the config file preference
+ *
+ * @access     public
+ * @return     integer
+ */    
+if ( ! function_exists('now'))
+{
+       function now()
+       {
+               $CI =& get_instance();
+       
+               if (strtolower($CI->config->item('time_reference')) == 'gmt')
+               {
+                       $now = time();
+                       $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));
+       
+                       if (strlen($system_time) < 10)
+                       {
+                               $system_time = time();
+                               log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.');
+                       }
+       
+                       return $system_time;
+               }
+               else
+               {
+                       return time();
+               }
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Convert MySQL Style Datecodes
+ *
+ * This function is identical to PHPs date() function,
+ * except that it allows date codes to be formatted using
+ * the MySQL style, where each code letter is preceded
+ * with a percent sign:  %Y %m %d etc...
+ *
+ * The benefit of doing dates this way is that you don't
+ * have to worry about escaping your text letters that
+ * match the date codes.
+ *
+ * @access     public
+ * @param      string
+ * @param      integer
+ * @return     integer
+ */    
+if ( ! function_exists('mdate'))
+{
+       function mdate($datestr = '', $time = '')
+       {
+               if ($datestr == '')
+                       return '';
+       
+               if ($time == '')
+                       $time = now();
+               
+               $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr));
+               return date($datestr, $time);
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Standard Date
+ *
+ * Returns a date formatted according to the submitted standard.
+ *
+ * @access     public
+ * @param      string  the chosen format
+ * @param      integer Unix timestamp
+ * @return     string
+ */    
+if ( ! function_exists('standard_date'))
+{
+       function standard_date($fmt = 'DATE_RFC822', $time = '')
+       {
+               $formats = array(
+                                               'DATE_ATOM'             =>      '%Y-%m-%dT%H:%i:%s%Q',
+                                               'DATE_COOKIE'   =>      '%l, %d-%M-%y %H:%i:%s UTC',
+                                               'DATE_ISO8601'  =>      '%Y-%m-%dT%H:%i:%s%O',
+                                               'DATE_RFC822'   =>      '%D, %d %M %y %H:%i:%s %O',
+                                               'DATE_RFC850'   =>      '%l, %d-%M-%y %H:%m:%i UTC',
+                                               'DATE_RFC1036'  =>      '%D, %d %M %y %H:%i:%s %O',
+                                               'DATE_RFC1123'  =>      '%D, %d %M %Y %H:%i:%s %O',
+                                               'DATE_RSS'              =>      '%D, %d %M %Y %H:%i:%s %O',
+                                               'DATE_W3C'              =>      '%Y-%m-%dT%H:%i:%s%Q'
+                                               );
+
+               if ( ! isset($formats[$fmt]))
+               {
+                       return FALSE;
+               }
+       
+               return mdate($formats[$fmt], $time);
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Timespan
+ *
+ * Returns a span of seconds in this format:
+ *     10 days 14 hours 36 minutes 47 seconds
+ *
+ * @access     public
+ * @param      integer a number of seconds
+ * @param      integer Unix timestamp
+ * @return     integer
+ */    
+if ( ! function_exists('timespan'))
+{
+       function timespan($seconds = 1, $time = '')
+       {
+               $CI =& get_instance();
+               $CI->lang->load('date');
+
+               if ( ! is_numeric($seconds))
+               {
+                       $seconds = 1;
+               }
+       
+               if ( ! is_numeric($time))
+               {
+                       $time = time();
+               }
+       
+               if ($time <= $seconds)
+               {
+                       $seconds = 1;
+               }
+               else
+               {
+                       $seconds = $time - $seconds;
+               }
+               
+               $str = '';
+               $years = floor($seconds / 31536000);
+       
+               if ($years > 0)
+               {       
+                       $str .= $years.' '.$CI->lang->line((($years     > 1) ? 'date_years' : 'date_year')).', ';
+               }       
+       
+               $seconds -= $years * 31536000;
+               $months = floor($seconds / 2628000);
+       
+               if ($years > 0 OR $months > 0)
+               {
+                       if ($months > 0)
+                       {       
+                               $str .= $months.' '.$CI->lang->line((($months   > 1) ? 'date_months' : 'date_month')).', ';
+                       }       
+       
+                       $seconds -= $months * 2628000;
+               }
+
+               $weeks = floor($seconds / 604800);
+       
+               if ($years > 0 OR $months > 0 OR $weeks > 0)
+               {
+                       if ($weeks > 0)
+                       {       
+                               $str .= $weeks.' '.$CI->lang->line((($weeks     > 1) ? 'date_weeks' : 'date_week')).', ';
+                       }
+               
+                       $seconds -= $weeks * 604800;
+               }                       
+
+               $days = floor($seconds / 86400);
+       
+               if ($months > 0 OR $weeks > 0 OR $days > 0)
+               {
+                       if ($days > 0)
+                       {       
+                               $str .= $days.' '.$CI->lang->line((($days       > 1) ? 'date_days' : 'date_day')).', ';
+                       }
+       
+                       $seconds -= $days * 86400;
+               }
+       
+               $hours = floor($seconds / 3600);
+       
+               if ($days > 0 OR $hours > 0)
+               {
+                       if ($hours > 0)
+                       {
+                               $str .= $hours.' '.$CI->lang->line((($hours     > 1) ? 'date_hours' : 'date_hour')).', ';
+                       }
+               
+                       $seconds -= $hours * 3600;
+               }
+       
+               $minutes = floor($seconds / 60);
+       
+               if ($days > 0 OR $hours > 0 OR $minutes > 0)
+               {
+                       if ($minutes > 0)
+                       {       
+                               $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', ';
+                       }
+               
+                       $seconds -= $minutes * 60;
+               }
+       
+               if ($str == '')
+               {
+                       $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', ';
+               }
+                       
+               return substr(trim($str), 0, -1);
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Number of days in a month
+ *
+ * Takes a month/year as input and returns the number of days
+ * for the given month/year. Takes leap years into consideration.
+ *
+ * @access     public
+ * @param      integer a numeric month
+ * @param      integer a numeric year
+ * @return     integer
+ */    
+if ( ! function_exists('days_in_month'))
+{
+       function days_in_month($month = 0, $year = '')
+       {
+               if ($month < 1 OR $month > 12)
+               {
+                       return 0;
+               }
+       
+               if ( ! is_numeric($year) OR strlen($year) != 4)
+               {
+                       $year = date('Y');
+               }
+       
+               if ($month == 2)
+               {
+                       if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))
+                       {
+                               return 29;
+                       }
+               }
+
+               $days_in_month  = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+               return $days_in_month[$month - 1];
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Converts a local Unix timestamp to GMT
+ *
+ * @access     public
+ * @param      integer Unix timestamp
+ * @return     integer
+ */    
+if ( ! function_exists('local_to_gmt'))
+{
+       function local_to_gmt($time = '')
+       {
+               if ($time == '')
+                       $time = time();
+       
+               return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time));
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Converts GMT time to a localized value
+ *
+ * Takes a Unix timestamp (in GMT) as input, and returns
+ * at the local value based on the timezone and DST setting
+ * submitted
+ *
+ * @access     public
+ * @param      integer Unix timestamp
+ * @param      string  timezone
+ * @param      bool    whether DST is active
+ * @return     integer
+ */    
+if ( ! function_exists('gmt_to_local'))
+{
+       function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)
+       {                       
+               if ($time == '')
+               {
+                       return now();
+               }
+       
+               $time += timezones($timezone) * 3600;
+
+               if ($dst == TRUE)
+               {
+                       $time += 3600;
+               }
+       
+               return $time;
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Converts a MySQL Timestamp to Unix
+ *
+ * @access     public
+ * @param      integer Unix timestamp
+ * @return     integer
+ */    
+if ( ! function_exists('mysql_to_unix'))
+{
+       function mysql_to_unix($time = '')
+       {
+               // We'll remove certain characters for backward compatibility
+               // since the formatting changed with MySQL 4.1
+               // YYYY-MM-DD HH:MM:SS
+       
+               $time = str_replace('-', '', $time);
+               $time = str_replace(':', '', $time);
+               $time = str_replace(' ', '', $time);
+       
+               // YYYYMMDDHHMMSS
+               return  mktime(
+                                               substr($time, 8, 2),
+                                               substr($time, 10, 2),
+                                               substr($time, 12, 2),
+                                               substr($time, 4, 2),
+                                               substr($time, 6, 2),
+                                               substr($time, 0, 4)
+                                               );
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Unix to "Human"
+ *
+ * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM
+ *
+ * @access     public
+ * @param      integer Unix timestamp
+ * @param      bool    whether to show seconds
+ * @param      string  format: us or euro
+ * @return     string
+ */    
+if ( ! function_exists('unix_to_human'))
+{
+       function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')
+       {
+               $r  = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' ';
+               
+               if ($fmt == 'us')
+               {
+                       $r .= date('h', $time).':'.date('i', $time);
+               }
+               else
+               {
+                       $r .= date('H', $time).':'.date('i', $time);
+               }
+       
+               if ($seconds)
+               {
+                       $r .= ':'.date('s', $time);
+               }
+       
+               if ($fmt == 'us')
+               {
+                       $r .= ' '.date('A', $time);
+               }
+               
+               return $r;
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Convert "human" date to GMT
+ *
+ * Reverses the above process
+ *
+ * @access     public
+ * @param      string  format: us or euro
+ * @return     integer
+ */    
+if ( ! function_exists('human_to_unix'))
+{
+       function human_to_unix($datestr = '')
+       {
+               if ($datestr == '')
+               {
+                       return FALSE;
+               }
+       
+               $datestr = trim($datestr);
+               $datestr = preg_replace("/\040+/", "\040", $datestr);
+
+               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))
+               {
+                       return FALSE;
+               }
+
+               $split = preg_split("/\040/", $datestr);
+
+               $ex = explode("-", $split['0']);
+       
+               $year  = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0'];
+               $month = (strlen($ex['1']) == 1) ? '0'.$ex['1']  : $ex['1'];
+               $day   = (strlen($ex['2']) == 1) ? '0'.$ex['2']  : $ex['2'];
+
+               $ex = explode(":", $split['1']);
+       
+               $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0'];
+               $min  = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];
+
+               if (isset($ex['2']) AND ereg("[0-9]{1,2}", $ex['2']))
+               {
+                       $sec  = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];
+               }
+               else
+               {
+                       // Unless specified, seconds get set to zero.
+                       $sec = '00';
+               }
+       
+               if (isset($split['2']))
+               {
+                       $ampm = strtolower($split['2']);
+               
+                       if (substr($ampm, 0, 1) == 'p' AND $hour < 12)
+                               $hour = $hour + 12;
+                       
+                       if (substr($ampm, 0, 1) == 'a' AND $hour == 12)
+                               $hour =  '00';
+                       
+                       if (strlen($hour) == 1)
+                               $hour = '0'.$hour;
+               }
+                       
+               return mktime($hour, $min, $sec, $month, $day, $year);
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Timezone Menu
+ *
+ * Generates a drop-down menu of timezones.
+ *
+ * @access     public
+ * @param      string  timezone
+ * @param      string  classname
+ * @param      string  menu name
+ * @return     string
+ */    
+if ( ! function_exists('timezone_menu'))
+{
+       function timezone_menu($default = 'UTC', $class = "", $name = 'timezones')
+       {
+               $CI =& get_instance();
+               $CI->lang->load('date');
+       
+               if ($default == 'GMT')
+                       $default = 'UTC';
+
+               $menu = '<select name="'.$name.'"';
+       
+               if ($class != '')
+               {
+                       $menu .= ' class="'.$class.'"';
+               }
+       
+               $menu .= ">\n";
+       
+               foreach (timezones() as $key => $val)
+               {
+                       $selected = ($default == $key) ? " selected='selected'" : '';
+                       $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n";
+               }
+
+               $menu .= "</select>";
+
+               return $menu;
+       }
+}
+       
+// ------------------------------------------------------------------------
+
+/**
+ * Timezones
+ *
+ * Returns an array of timezones.  This is a helper function
+ * for various other ones in this library
+ *
+ * @access     public
+ * @param      string  timezone
+ * @return     string
+ */    
+if ( ! function_exists('timezones'))
+{
+       function timezones($tz = '')
+       {
+               // Note: Don't change the order of these even though
+               // some items appear to be in the wrong order
+               
+               $zones = array( 
+                                               'UM12'          => -12,
+                                               'UM11'          => -11,
+                                               'UM10'          => -10,
+                                               'UM95'          => -9.5,
+                                               'UM9'           => -9,
+                                               'UM8'           => -8,
+                                               'UM7'           => -7,
+                                               'UM6'           => -6,
+                                               'UM5'           => -5,
+                                               'UM45'          => -4.5,
+                                               'UM4'           => -4,
+                                               'UM35'          => -3.5,
+                                               'UM3'           => -3,
+                                               'UM2'           => -2,
+                                               'UM1'           => -1,
+                                               'UTC'           => 0,
+                                               'UP1'           => +1,
+                                               'UP2'           => +2,
+                                               'UP3'           => +3,
+                                               'UP35'          => +3.5,
+                                               'UP4'           => +4,
+                                               'UP45'          => +4.5,
+                                               'UP5'           => +5,
+                                               'UP55'          => +5.5,
+                                               'UP575'         => +5.75,
+                                               'UP6'           => +6,
+                                               'UP65'          => +6.5,
+                                               'UP7'           => +7,
+                                               'UP8'           => +8,
+                                               'UP875'         => +8.75,
+                                               'UP9'           => +9,
+                                               'UP95'          => +9.5,
+                                               'UP10'          => +10,
+                                               'UP105'         => +10.5,
+                                               'UP11'          => +11,
+                                               'UP115'         => +11.5,
+                                               'UP12'          => +12,
+                                               'UP1275'        => +12.75,
+                                               'UP13'          => +13,
+                                               'UP14'          => +14
+                                       );
+                               
+               if ($tz == '')
+               {
+                       return $zones;
+               }
+       
+               if ($tz == 'GMT')
+                       $tz = 'UTC';
+       
+               return ( ! isset($zones[$tz])) ? 0 : $zones[$tz];
+       }
+}
+
+
+/* End of file date_helper.php */
 /* Location: ./system/helpers/date_helper.php */
\ No newline at end of file