From b1a6a5a3991cec5cd08873b01376e45d0b247f18 Mon Sep 17 00:00:00 2001
From: Marius Cramer <m.cramer@pixcept.de>
Date: Thu, 14 Nov 2013 09:05:33 -0500
Subject: [PATCH] Cleaning up code to match coding guidelines

---
 server/lib/classes/libdatetime.inc.php |  882 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 446 insertions(+), 436 deletions(-)

diff --git a/server/lib/classes/libdatetime.inc.php b/server/lib/classes/libdatetime.inc.php
index 2735768..fe2b815 100644
--- a/server/lib/classes/libdatetime.inc.php
+++ b/server/lib/classes/libdatetime.inc.php
@@ -30,450 +30,460 @@
 
 /**
  * Date and Time class
- * 
+ *
  * provides functions related to date and time operations
  */
+
+
 abstract class ISPConfigDateTime {
 
-    /**
-     * Get days, hours, minutes and seconds
-     *
-     * Returns an array with days, hours, minutes and seconds from a given amount of seconds
-     *
-     * @access public
-     * @param int $seconds amount of seconds
-     * @param bool $get_days if true get the days, too
-     * @return array data (0 => days, 1 => hours, 2 => minutes, 3 => seconds)
-     */
-    public static function get_parts($seconds, $get_days = false) {
-        $days = 0;
-        if($get_days == true) {
-            $days = floor($seconds / (3600 * 24));
-            $seconds = $seconds % (3600 * 24);
-        }
-        $hours = floor($seconds / 3600);
-        $seconds = $seconds % 3600;
-        $minutes = floor($seconds / 60);
-        $seconds = $seconds % 60;
-        
-        return array($days, $hours, $minutes, $seconds);
-    }
-    
-    public static function dbtime() {
-        global $app;
-        
-        $time = $app->db->queryOneRecord('SELECT UNIX_TIMESTAMP() as `time`');
-        return $time['time'];
-    }
-    
-    /**
-     * Get a unix timestamp for a date
-     * 
-     * @access public
-     * @param mixed $date the date to convert. Can be
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @return int the unix timestamp
-     */
-    public static function to_timestamp($date) {
-        if(!is_string($date) && !is_numeric($date)) return false;
-        $date = trim($date);
-        
-        if(is_numeric($date)) return $date;
-        
-        if(strpos($date, '-') !== false) {
-            $regex = "(\d{2,4})-(\d{1,2})-(\d{1,2})(\s+(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?";
-            $ok = preg_match("'$regex'", $date, $matches);
-            if($ok) {
-                $year = $matches[1];
-                $month = $matches[2];
-                $day = $matches[3];
-                $hour = isset($matches[5]) ? $matches[5] : 0;
-                $minute = isset($matches[6]) ? $matches[6] : 0;
-                $second = isset($matches[8]) ? $matches[8] : 0;
-            }
-        } else {
-            $regex = "(\d{1,2})[/.](\d{1,2})[/.](\d{2,4})(\s+(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?";
-            $ok = preg_match("'$regex'", $date, $matches);
-            if($ok) {
-                $year = $matches[3];
-                $month = $matches[2];
-                $day = $matches[1];
-                $hour = isset($matches[5]) ? $matches[5] : 0;
-                $minute = isset($matches[6]) ? $matches[6] : 0;
-                $second = isset($matches[8]) ? $matches[8] : 0;
-            }
-        }
-        
-        if(!$ok) return false;
-        
-        if(!$day || !$month || !$year) return false;
-        if(!$hour) $hour = 0;
-        if(!$minute) $minute = 0;
-        if(!$second) $second = 0;
-        if($year < 1900) $year += 1900;
-        
-        if(!checkdate($month, $day, $year)) return false;
-        
-        $date = mktime($hour, $minute, $second, $month, $day, $year);
-        
-        return $date;
-    }
+	/**
+	 * Get days, hours, minutes and seconds
+	 *
+	 * Returns an array with days, hours, minutes and seconds from a given amount of seconds
+	 *
+	 * @access public
+	 * @param int $seconds amount of seconds
+	 * @param bool $get_days if true get the days, too
+	 * @return array data (0 => days, 1 => hours, 2 => minutes, 3 => seconds)
+	 */
+	public static function get_parts($seconds, $get_days = false) {
+		$days = 0;
+		if($get_days == true) {
+			$days = floor($seconds / (3600 * 24));
+			$seconds = $seconds % (3600 * 24);
+		}
+		$hours = floor($seconds / 3600);
+		$seconds = $seconds % 3600;
+		$minutes = floor($seconds / 60);
+		$seconds = $seconds % 60;
 
-    /**
-     * Get a date string
-     *
-     * Returns a formatted date string
-     *
-     * @access public
-     * @param mixed $date the date to convert. Can be
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param string $format the format to get the date string in.
-     * - short: dd.mm.yy
-     * - veryshort: dd.mm.
-     * - medium: dd.mm.yyyy
-     * - long: dd. Month yyyy
-     * - extra: Day, dd. Month yyyy
-     * - day: dd
-     * - monthnum: mm
-     * - shortmonth: Short month name like Mar for March
-     * - month: Month name
-     * - shortyear: yy
-     * - year: yyyy
-     * - onlydate: dd.mm
-     * - onlydatelong: dd. Month
-     * - onlytime: HH:MM
-     * - rss: Rss time format for XML
-     * - nice: if you prepend a nice: (like nice:long) you will get results like "today" or "yesterday" if applicable
-     * - custom: you can give a strftime format like %d.%m.%Y %H:%M if you prepend custom: to it
-     * @param bool $time if true apped the time to the date string
-     * @param bool $seconds if true append the seconds to the time
-     * @return string date string
-     */
-    public static function to_string($date, $format = 'short', $time = false, $seconds = false) {
-        global $portal;
-        
-        if(!$date) return '';
-        
-        setlocale(LC_TIME, array('de_DE.UTF-8', 'de_DE', 'de_DE.ISO-8859-1', 'de_DE.ISO-8859-15'));
-        
-        if(!is_numeric($date)) {
-            $date = self::to_timestamp($date);
-            if($date === false) return $date;
-        }
-        
-        if($format == 'timestamp') return $date;
-        
-        $fmt = '';
-        $prepend = '';
-        if(substr($format, 0, 5) == 'nice:') {
-            if(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime())) {
-                if($time == true) $format = 'onlytime';
-                else $format = '';
-                $prepend = 'Heute';
-            } elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() - 86400)) {
-                if($time == true) $format = 'onlytime';
-                else $format = '';
-                $prepend = 'Gestern';
-            } elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() + 86400)) {
-                if($time == true) $format = 'onlytime';
-                else $format = '';
-                $prepend = 'Morgen';
-            } else {
-                $format = substr($format, 5);
-            }
-        } elseif(substr($format, 0, 7) == 'custom:') {
-            $fmt = substr($format, 7);
-            $format = '';
-            $time = false;
-        }
-        
-        if($format == 'short') $fmt = '%d.%m.%y';
-        elseif($format == 'veryshort') $fmt = '%d.%m.';
-        elseif($format == 'medium') $fmt = '%d.%m.%Y';
-        elseif($format == 'long') $fmt = '%d. %B %Y';
-        elseif($format == 'extra') $fmt = '%A, %d. %B %Y';
-        elseif($format == 'day') $fmt = '%d';
-        elseif($format == 'monthnum') $fmt = '%m';
-        elseif($format == 'shortmonth') $fmt = '%b';
-        elseif($format == 'month') $fmt = '%B';
-        elseif($format == 'shortyear') $fmt = '%y';
-        elseif($format == 'year') $fmt = '%Y';
-        elseif($format == 'onlydate') $fmt = '%d.%m.';
-        elseif($format == 'onlydatelong') $fmt = '%d. %B';
-        elseif($format == 'onlytime') {
-            $fmt = '%H:%M';
-            $time = false;
-        } elseif($format == 'rss') {
-            $ret = date(DATE_RSS, $date);
-            if($prepend != '') $ret = $prepend . ' ' . $ret;
-            return $ret;
-        } elseif($format == 'sitemap') {
-            $ret = date(DATE_ATOM, $date);
-            if($prepend != '') $ret = $prepend . ' ' . $ret;
-            return $ret;
-        }
-        if($time == true) $fmt .= ' %H:%M' . ($seconds == true ? ':%S' : '');
-        
-        if($fmt != '') $ret = strftime($fmt, $date);
-        else $ret = '';
-        
-        if($prepend != '') $ret = trim($prepend . ' ' . $ret);
-        return $ret;
-    }
+		return array($days, $hours, $minutes, $seconds);
+	}
 
-    /**
-     * Get the month difference of two dates
-     *
-     * Gets the difference in months of two given dates.
-     * The days are ignored, so the difference between 2010-01-21 and 2010-05-01 is 4!
-     *
-     * @access public
-     * @param mixed $date_from the beginning date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param mixed $date_to the ending date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param bool $return_years if set to true, the function returns an array of years and months instead of months
-     * @param bool $include_both if set to true, the starting AND ending month is included, so the month count is +1
-     * @return mixed either int (months) or array of int (0 => years, 1 => months) or FALSE on invalid dates
-     */
-    public static function months_between($date_from, $date_to, $return_years = false, $include_both = false) {
-        $date_from = self::to_string($date_from, 'custom:%Y%m');
-        if($date_from === false) return $date_from;
-        
-        $date_to = self::to_string($date_to, 'custom:%Y%m');
-        if($date_to === false) return $date_to;
-        
-        $date_from = intval($date_from);
-        $date_to = intval($date_to);
-        
-        if($date_to < $date_from) return false;
-        
-        $result = $date_to - $date_from;
-        if($include_both == true) $result++;
-        
-        $years = floor($result / 100);
-        $months = $result % 100;
-        if($months > 12) $months -= 88;
-        elseif($months == 12) {
-            $months = 0;
-            $years++;
-        }
-        if($return_years == true) return array($years, $months);
-        
-        $months += ($years * 12);
-        return $months;
-    }
+	public static function dbtime() {
+		global $app;
 
-    /**
-     * Get the day difference of two dates
-     *
-     * Gets the difference in days of two given dates.
-     *
-     * @access public
-     * @param mixed $date_from the beginning date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param mixed $date_to the ending date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param bool $include_both if set to true, the starting AND ending day is included, so the day count is +1
-     * @return mixed either int (days) or FALSE on invalid dates
-     */
-    public static function days_between($date_from, $date_to, $include_both = false) {
-        $date_from = self::to_string($date_from, 'custom:%Y-%m-%d');
-        if($date_from === false) return $date_from;
-        list($y, $m, $d) = explode('-', $date_from);
-        $ts_from = mktime(0, 0, 0, $m, $d, $y);
-        
-        $date_to = self::to_string($date_to, 'custom:%Y-%m-%d');
-        if($date_to === false) return $date_to;
-        list($y, $m, $d) = explode('-', $date_to);
-        $ts_to = mktime(0, 0, 0, $m, $d, $y);
-        
-        $result = $ts_to - $ts_from;
-        if($include_both == true) $result++;
-        
-        $days = floor($result / (3600 * 24));
-        
-        return $days;
-    }
+		$time = $app->db->queryOneRecord('SELECT UNIX_TIMESTAMP() as `time`');
+		return $time['time'];
+	}
 
-    /**
-     * Check if one date is before another
-     *
-     * @access public
-     * @param mixed $date_1 the first date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @param mixed $date_2 the second date, either
-     * - int (unix timestamp)
-     * - date string yyyy-mm-dd[ hh:mm:ss]
-     * - date string dd.mm.yyyy[ hh:mm:ss]
-     * @return mixed either int (1 if the first date is earlier, -1 if the second date is earlier, 0 if both are the same) or FALSE on invalid dates
-     */
-    public static function compare($date_1, $date_2) {
-        $ts_1 = self::to_timestamp($date_1);
-        if($ts_1 === false) return false;
-        $ts_2 = self::to_timestamp($date_2);
-        if($ts_2 === false) return false;
-        
-        if($ts_1 < $ts_2) return 1;
-        elseif($ts_1 > $ts_2) return -1;
-        else return 0;
-    }
-    
-    /**
-     * Convert date to sql format
-     *
-     * Converts a date from different formats to the sql format if possible
-     *
-     * @access public
-     * @param string $date date string in forms
-     * - dd.mm.yy
-     * - yyyy-mm-dd
-     * - yy-mm-dd
-     * - yyyy/mm/dd
-     * - dd.mm.yy
-     * - all formats can have time information HH:MM:SS appended
-     * @param bool $no_time if true, the resulting sql date is without time part even if time was part of the input
-     * @return mixed sql date string on success, error object otherwise
-     */
-    public static function sql_date($date = false, $no_time = false) {
-        global $portal;
-        
-        $result = '';
-        $time = '';
-        
-        if($date === false) $date = $portal->getTime(true);
-        
-        if(is_numeric($date)) {
-            return ($no_time ? strftime('%Y-%m-%d', $date) : strftime('%Y-%m-%d %H:%M:%S', $date));
-        }
-        
-        if(preg_match('/^(.*)(\d{1,2}:\d{1,2}(:\d{1,2})?)(\D|$)/', $date, $matches)) {
-            $date = $matches[1];
-            $time = ' ' . $matches[2];
-        }
-        if(preg_match('/(^|\D)(\d{4,4})-(\d{1,2})-(\d{1,2})(\D|$)/', $date, $result)) {
-            $day = $result[4];
-            $month = $result[3];
-            $year = $result[2];
-        } elseif(preg_match('/(^|\D)(\d{4,4})\/(\d{1,2})\/(\d{1,2})(\D|$)/', $date, $result)) {
-            $day = $result[4];
-            $month = $result[3];
-            $year = $result[2];
-        } elseif(preg_match('/(^|\D)(\d{2,2})-(\d{1,2})-(\d{1,2})(\D|$)/', $date, $result)) {
-            $day = $result[4];
-            $month = $result[3];
-            $year = $result[2];
-        } elseif(preg_match('/(^|\D)(\d{1,2})\.(\d{1,2})\.(\d{4,4})(\D|$)/', $date, $result)) {
-            $day = $result[2];
-            $month = $result[3];
-            $year = $result[4];
-        } elseif(preg_match('/(^|\D)(\d{1,2})\.(\d{1,2})\.(\d{2,2})(\D|$)/', $date, $result)) {
-            $day = $result[2];
-            $month = $result[3];
-            $year = $result[4];
-        } else {
-            return false;
-        }
-        if($no_time == true) $time = '';
-        
-        $day = str_pad(intval($day), 2, '0', STR_PAD_LEFT);
-        $month = str_pad(intval($month), 2, '0', STR_PAD_LEFT);
-        $year = intval($year);
 
-        $valid = checkdate($month, $day, $year);
-        if(!$valid) return false;
-        
-        return $year . '-' . $month . '-' . $day . $time;
-    }
-    
-    /**
-     * Get information if given date is leap year
-     * 
-     * @access public
-     * @param mixed $date Date to check
-     * @return bool true if leap year, false otherwise
-     */
-    public static function is_leap_year($date) {
-        // check if only year was given
-        if(is_numeric($date) && $date < 10000) $date .= '-01-01';
-        
-        $ts = self::to_timestamp($date);
-        if($ts === false) return false;
-        
-        if(date('L', $ts) == 1) return true;
-        else return false;
-    }
-    
-    /**
-     * Get the last day of the month
-     * 
-     * @access public
-     * @param int $month the month to get the last day for
-     * @param int $year the corresponding year (for february in leap years)
-     * @return bool true if leap year, false otherwise
-     */
-    public static function last_day($month, $year = false) {
-        switch($month) {
-            case 1:
-            case 3:
-            case 5:
-            case 7:
-            case 8:
-            case 10:
-            case 12:
-                return 31;
-                break;
-            case 2:
-                return ($year !== false && self::is_leap_year($year) ? 29 : 28);
-                break;
-            default:
-                return 30;
-                break;
-        }
-    }
 
-    /**
-     * Get age for given date
-     *
-     * Returns the age for a given date if possible
-     *
-     * @access public
-     * @param string $date see ISPConfigDateTime::sql_date() for possible values
-     * @return mixed int of age if successful, error object otherwise
-     * @see ISPConfigDateTime::sql_date
-     */
-    public static function calc_age($date) {
-        global $portal;
-        
-        $date = self::sql_date($date);
-        if($date === false) return $date;
-        
-        list($year, $month, $day) = explode('-', $date);
-        list($curyear, $curmonth, $curday) = explode('-', strftime('%Y-%m-%d', $portal->getTime()));
-        
-        $year_diff = $curyear - $year;
-        $month_diff = $curmonth - $month;
-        $day_diff = $curday - $day;
-        
-        if($day_diff < 0) $month_diff--;
-        if($month_diff < 0) $year_diff--;
-        if($year_diff < 0) $year_diff = 0;
-        
-        return $year_diff;
-    }
+	/**
+	 * Get a unix timestamp for a date
+	 *
+	 * @access public
+	 * @param mixed $date the date to convert. Can be
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @return int the unix timestamp
+	 */
+	public static function to_timestamp($date) {
+		if(!is_string($date) && !is_numeric($date)) return false;
+		$date = trim($date);
+
+		if(is_numeric($date)) return $date;
+
+		if(strpos($date, '-') !== false) {
+			$regex = "(\d{2,4})-(\d{1,2})-(\d{1,2})(\s+(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?";
+			$ok = preg_match("'$regex'", $date, $matches);
+			if($ok) {
+				$year = $matches[1];
+				$month = $matches[2];
+				$day = $matches[3];
+				$hour = isset($matches[5]) ? $matches[5] : 0;
+				$minute = isset($matches[6]) ? $matches[6] : 0;
+				$second = isset($matches[8]) ? $matches[8] : 0;
+			}
+		} else {
+			$regex = "(\d{1,2})[/.](\d{1,2})[/.](\d{2,4})(\s+(\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?";
+			$ok = preg_match("'$regex'", $date, $matches);
+			if($ok) {
+				$year = $matches[3];
+				$month = $matches[2];
+				$day = $matches[1];
+				$hour = isset($matches[5]) ? $matches[5] : 0;
+				$minute = isset($matches[6]) ? $matches[6] : 0;
+				$second = isset($matches[8]) ? $matches[8] : 0;
+			}
+		}
+
+		if(!$ok) return false;
+
+		if(!$day || !$month || !$year) return false;
+		if(!$hour) $hour = 0;
+		if(!$minute) $minute = 0;
+		if(!$second) $second = 0;
+		if($year < 1900) $year += 1900;
+
+		if(!checkdate($month, $day, $year)) return false;
+
+		$date = mktime($hour, $minute, $second, $month, $day, $year);
+
+		return $date;
+	}
+
+	/**
+	 * Get a date string
+	 *
+	 * Returns a formatted date string
+	 *
+	 * @access public
+	 * @param mixed $date the date to convert. Can be
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param string $format the format to get the date string in.
+	 * - short: dd.mm.yy
+	 * - veryshort: dd.mm.
+	 * - medium: dd.mm.yyyy
+	 * - long: dd. Month yyyy
+	 * - extra: Day, dd. Month yyyy
+	 * - day: dd
+	 * - monthnum: mm
+	 * - shortmonth: Short month name like Mar for March
+	 * - month: Month name
+	 * - shortyear: yy
+	 * - year: yyyy
+	 * - onlydate: dd.mm
+	 * - onlydatelong: dd. Month
+	 * - onlytime: HH:MM
+	 * - rss: Rss time format for XML
+	 * - nice: if you prepend a nice: (like nice:long) you will get results like "today" or "yesterday" if applicable
+	 * - custom: you can give a strftime format like %d.%m.%Y %H:%M if you prepend custom: to it
+	 * @param bool $time if true apped the time to the date string
+	 * @param bool $seconds if true append the seconds to the time
+	 * @return string date string
+	 */
+	public static function to_string($date, $format = 'short', $time = false, $seconds = false) {
+		global $portal;
+
+		if(!$date) return '';
+
+		setlocale(LC_TIME, array('de_DE.UTF-8', 'de_DE', 'de_DE.ISO-8859-1', 'de_DE.ISO-8859-15'));
+
+		if(!is_numeric($date)) {
+			$date = self::to_timestamp($date);
+			if($date === false) return $date;
+		}
+
+		if($format == 'timestamp') return $date;
+
+		$fmt = '';
+		$prepend = '';
+		if(substr($format, 0, 5) == 'nice:') {
+			if(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime())) {
+				if($time == true) $format = 'onlytime';
+				else $format = '';
+				$prepend = 'Heute';
+			} elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() - 86400)) {
+				if($time == true) $format = 'onlytime';
+				else $format = '';
+				$prepend = 'Gestern';
+			} elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() + 86400)) {
+				if($time == true) $format = 'onlytime';
+				else $format = '';
+				$prepend = 'Morgen';
+			} else {
+				$format = substr($format, 5);
+			}
+		} elseif(substr($format, 0, 7) == 'custom:') {
+			$fmt = substr($format, 7);
+			$format = '';
+			$time = false;
+		}
+
+		if($format == 'short') $fmt = '%d.%m.%y';
+		elseif($format == 'veryshort') $fmt = '%d.%m.';
+		elseif($format == 'medium') $fmt = '%d.%m.%Y';
+		elseif($format == 'long') $fmt = '%d. %B %Y';
+		elseif($format == 'extra') $fmt = '%A, %d. %B %Y';
+		elseif($format == 'day') $fmt = '%d';
+		elseif($format == 'monthnum') $fmt = '%m';
+		elseif($format == 'shortmonth') $fmt = '%b';
+		elseif($format == 'month') $fmt = '%B';
+		elseif($format == 'shortyear') $fmt = '%y';
+		elseif($format == 'year') $fmt = '%Y';
+		elseif($format == 'onlydate') $fmt = '%d.%m.';
+		elseif($format == 'onlydatelong') $fmt = '%d. %B';
+		elseif($format == 'onlytime') {
+			$fmt = '%H:%M';
+			$time = false;
+		} elseif($format == 'rss') {
+			$ret = date(DATE_RSS, $date);
+			if($prepend != '') $ret = $prepend . ' ' . $ret;
+			return $ret;
+		} elseif($format == 'sitemap') {
+			$ret = date(DATE_ATOM, $date);
+			if($prepend != '') $ret = $prepend . ' ' . $ret;
+			return $ret;
+		}
+		if($time == true) $fmt .= ' %H:%M' . ($seconds == true ? ':%S' : '');
+
+		if($fmt != '') $ret = strftime($fmt, $date);
+		else $ret = '';
+
+		if($prepend != '') $ret = trim($prepend . ' ' . $ret);
+		return $ret;
+	}
+
+	/**
+	 * Get the month difference of two dates
+	 *
+	 * Gets the difference in months of two given dates.
+	 * The days are ignored, so the difference between 2010-01-21 and 2010-05-01 is 4!
+	 *
+	 * @access public
+	 * @param mixed $date_from the beginning date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param mixed $date_to the ending date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param bool $return_years if set to true, the function returns an array of years and months instead of months
+	 * @param bool $include_both if set to true, the starting AND ending month is included, so the month count is +1
+	 * @return mixed either int (months) or array of int (0 => years, 1 => months) or FALSE on invalid dates
+	 */
+	public static function months_between($date_from, $date_to, $return_years = false, $include_both = false) {
+		$date_from = self::to_string($date_from, 'custom:%Y%m');
+		if($date_from === false) return $date_from;
+
+		$date_to = self::to_string($date_to, 'custom:%Y%m');
+		if($date_to === false) return $date_to;
+
+		$date_from = intval($date_from);
+		$date_to = intval($date_to);
+
+		if($date_to < $date_from) return false;
+
+		$result = $date_to - $date_from;
+		if($include_both == true) $result++;
+
+		$years = floor($result / 100);
+		$months = $result % 100;
+		if($months > 12) $months -= 88;
+		elseif($months == 12) {
+			$months = 0;
+			$years++;
+		}
+		if($return_years == true) return array($years, $months);
+
+		$months += ($years * 12);
+		return $months;
+	}
+
+	/**
+	 * Get the day difference of two dates
+	 *
+	 * Gets the difference in days of two given dates.
+	 *
+	 * @access public
+	 * @param mixed $date_from the beginning date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param mixed $date_to the ending date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param bool $include_both if set to true, the starting AND ending day is included, so the day count is +1
+	 * @return mixed either int (days) or FALSE on invalid dates
+	 */
+	public static function days_between($date_from, $date_to, $include_both = false) {
+		$date_from = self::to_string($date_from, 'custom:%Y-%m-%d');
+		if($date_from === false) return $date_from;
+		list($y, $m, $d) = explode('-', $date_from);
+		$ts_from = mktime(0, 0, 0, $m, $d, $y);
+
+		$date_to = self::to_string($date_to, 'custom:%Y-%m-%d');
+		if($date_to === false) return $date_to;
+		list($y, $m, $d) = explode('-', $date_to);
+		$ts_to = mktime(0, 0, 0, $m, $d, $y);
+
+		$result = $ts_to - $ts_from;
+		if($include_both == true) $result++;
+
+		$days = floor($result / (3600 * 24));
+
+		return $days;
+	}
+
+	/**
+	 * Check if one date is before another
+	 *
+	 * @access public
+	 * @param mixed $date_1 the first date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @param mixed $date_2 the second date, either
+	 * - int (unix timestamp)
+	 * - date string yyyy-mm-dd[ hh:mm:ss]
+	 * - date string dd.mm.yyyy[ hh:mm:ss]
+	 * @return mixed either int (1 if the first date is earlier, -1 if the second date is earlier, 0 if both are the same) or FALSE on invalid dates
+	 */
+	public static function compare($date_1, $date_2) {
+		$ts_1 = self::to_timestamp($date_1);
+		if($ts_1 === false) return false;
+		$ts_2 = self::to_timestamp($date_2);
+		if($ts_2 === false) return false;
+
+		if($ts_1 < $ts_2) return 1;
+		elseif($ts_1 > $ts_2) return -1;
+		else return 0;
+	}
+
+
+
+	/**
+	 * Convert date to sql format
+	 *
+	 * Converts a date from different formats to the sql format if possible
+	 *
+	 * @access public
+	 * @param string $date date string in forms
+	 * - dd.mm.yy
+	 * - yyyy-mm-dd
+	 * - yy-mm-dd
+	 * - yyyy/mm/dd
+	 * - dd.mm.yy
+	 * - all formats can have time information HH:MM:SS appended
+	 * @param bool $no_time if true, the resulting sql date is without time part even if time was part of the input
+	 * @return mixed sql date string on success, error object otherwise
+	 */
+	public static function sql_date($date = false, $no_time = false) {
+		global $portal;
+
+		$result = '';
+		$time = '';
+
+		if($date === false) $date = $portal->getTime(true);
+
+		if(is_numeric($date)) {
+			return $no_time ? strftime('%Y-%m-%d', $date) : strftime('%Y-%m-%d %H:%M:%S', $date);
+		}
+
+		if(preg_match('/^(.*)(\d{1,2}:\d{1,2}(:\d{1,2})?)(\D|$)/', $date, $matches)) {
+			$date = $matches[1];
+			$time = ' ' . $matches[2];
+		}
+		if(preg_match('/(^|\D)(\d{4,4})-(\d{1,2})-(\d{1,2})(\D|$)/', $date, $result)) {
+			$day = $result[4];
+			$month = $result[3];
+			$year = $result[2];
+		} elseif(preg_match('/(^|\D)(\d{4,4})\/(\d{1,2})\/(\d{1,2})(\D|$)/', $date, $result)) {
+			$day = $result[4];
+			$month = $result[3];
+			$year = $result[2];
+		} elseif(preg_match('/(^|\D)(\d{2,2})-(\d{1,2})-(\d{1,2})(\D|$)/', $date, $result)) {
+			$day = $result[4];
+			$month = $result[3];
+			$year = $result[2];
+		} elseif(preg_match('/(^|\D)(\d{1,2})\.(\d{1,2})\.(\d{4,4})(\D|$)/', $date, $result)) {
+			$day = $result[2];
+			$month = $result[3];
+			$year = $result[4];
+		} elseif(preg_match('/(^|\D)(\d{1,2})\.(\d{1,2})\.(\d{2,2})(\D|$)/', $date, $result)) {
+			$day = $result[2];
+			$month = $result[3];
+			$year = $result[4];
+		} else {
+			return false;
+		}
+		if($no_time == true) $time = '';
+
+		$day = str_pad(intval($day), 2, '0', STR_PAD_LEFT);
+		$month = str_pad(intval($month), 2, '0', STR_PAD_LEFT);
+		$year = intval($year);
+
+		$valid = checkdate($month, $day, $year);
+		if(!$valid) return false;
+
+		return $year . '-' . $month . '-' . $day . $time;
+	}
+
+
+
+	/**
+	 * Get information if given date is leap year
+	 *
+	 * @access public
+	 * @param mixed $date Date to check
+	 * @return bool true if leap year, false otherwise
+	 */
+	public static function is_leap_year($date) {
+		// check if only year was given
+		if(is_numeric($date) && $date < 10000) $date .= '-01-01';
+
+		$ts = self::to_timestamp($date);
+		if($ts === false) return false;
+
+		if(date('L', $ts) == 1) return true;
+		else return false;
+	}
+
+
+
+	/**
+	 * Get the last day of the month
+	 *
+	 * @access public
+	 * @param int $month the month to get the last day for
+	 * @param int $year the corresponding year (for february in leap years)
+	 * @return bool true if leap year, false otherwise
+	 */
+	public static function last_day($month, $year = false) {
+		switch($month) {
+		case 1:
+		case 3:
+		case 5:
+		case 7:
+		case 8:
+		case 10:
+		case 12:
+			return 31;
+			break;
+		case 2:
+			return $year !== false && self::is_leap_year($year) ? 29 : 28;
+			break;
+		default:
+			return 30;
+			break;
+		}
+	}
+
+	/**
+	 * Get age for given date
+	 *
+	 * Returns the age for a given date if possible
+	 *
+	 * @access public
+	 * @param string $date see ISPConfigDateTime::sql_date() for possible values
+	 * @return mixed int of age if successful, error object otherwise
+	 * @see ISPConfigDateTime::sql_date
+	 */
+	public static function calc_age($date) {
+		global $portal;
+
+		$date = self::sql_date($date);
+		if($date === false) return $date;
+
+		list($year, $month, $day) = explode('-', $date);
+		list($curyear, $curmonth, $curday) = explode('-', strftime('%Y-%m-%d', $portal->getTime()));
+
+		$year_diff = $curyear - $year;
+		$month_diff = $curmonth - $month;
+		$day_diff = $curday - $day;
+
+		if($day_diff < 0) $month_diff--;
+		if($month_diff < 0) $year_diff--;
+		if($year_diff < 0) $year_diff = 0;
+
+		return $year_diff;
+	}
+
 }
-

--
Gitblit v1.9.1