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