123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- <?php
- class Application_Common_DateHelper
- {
- private $_dateTime;
- function __construct()
- {
- $this->_dateTime = date("U");
- }
- /**
- * Get time of object construction in the format
- * YYYY-MM-DD HH:mm:ss
- */
- function getTimestamp()
- {
- return date("Y-m-d H:i:s", $this->_dateTime);
- }
- /**
- * Get time of object construction in the format
- * YYYY-MM-DD HH:mm:ss
- */
- function getUtcTimestamp()
- {
- return gmdate("Y-m-d H:i:s", $this->_dateTime);
- }
- /**
- * Get date of object construction in the format
- * YYYY-MM-DD
- */
- function getDate()
- {
- return gmdate("Y-m-d", $this->_dateTime);
- }
- /**
- * Get time of object construction in the format
- * HH:mm:ss
- */
- function getTime()
- {
- return gmdate("H:i:s", $this->_dateTime);
- }
-
- /** Get the abbreviated timezone for the currently logged in user.
- * @return A string containing the short form of the timezone set in the preferences for the current user (eg. EST, CEST, etc.)
- */
- public static function getUserTimezoneAbbreviation()
- {
- return self::getTimezoneAbbreviation(Application_Model_Preference::GetUserTimezone());
- }
-
- /** Get the abbreviated timezone string of the timezone the station is set to.
- * @return A string containing the short form of the station's timezone (eg. EST, CEST, etc.)
- */
- public static function getStationTimezoneAbbreviation()
- {
- return self::getTimezoneAbbreviation(Application_Model_Preference::GetDefaultTimezone());
- }
-
- private static function getTimezoneAbbreviation($fullTimeZoneName)
- {
- $timeZone = new DateTimeZone($fullTimeZoneName);
- $now = new DateTime("now", $timeZone);
- return $now->format("T");
- }
-
- public static function getUserTimezoneOffset()
- {
- $userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone());
- $now = new DateTime("now", $userTimezone);
-
- return $now->format("Z");
- }
-
- public static function getStationTimezoneOffset()
- {
- $stationTimezone = new DateTimeZone(Application_Model_Preference::GetDefaultTimezone());
- $now = new DateTime("now", $stationTimezone);
-
- return $now->format("Z");
- }
-
- /**
- *
- * @return DateTime - YYYY-MM-DD 00:00 in station timezone of today
- */
- public static function getTodayStationStartDateTime()
- {
- $stationTimezone = new DateTimeZone(Application_Model_Preference::GetDefaultTimezone());
- $now = new DateTime("now", $stationTimezone);
-
- $now->setTime(0, 0, 0);
-
- return $now;
- }
-
- /**
- *
- * @return DateTime - YYYY-MM-DD 00:00 in station timezone of tomorrow
- */
- public static function getTodayStationEndDateTime()
- {
- $stationTimezone = new DateTimeZone(Application_Model_Preference::GetDefaultTimezone());
- $now = new DateTime("now", $stationTimezone);
-
- $now->add(new DateInterval("P1D"));
- $now->setTime(0, 0, 0);
-
- return $now;
- }
-
- /**
- *
- * @return DateTime - YYYY-MM-DD 00:00 in station timezone
- */
- public static function getWeekStartDateTime()
- {
- $now = self::getTodayStationStartDateTime();
-
- // our week starts on monday, but php week starts on sunday.
- $day = $now->format('w');
- if ($day == 0) {
- $day = 7;
- }
-
- $dayDiff = $day - 1;
- if ($dayDiff > 0) {
- $now->sub(new DateInterval("P{$dayDiff}D"));
- }
-
- return $now;
- }
- /**
- * This function formats a time by removing seconds
- *
- * When we receive a time from the database we get the
- * format "hh:mm:ss". But when dealing with show times, we
- * do not care about the seconds.
- *
- * @param int $p_dateTime
- * The value which to format.
- * @return int
- * The timestamp with the new format "hh:mm", or
- * the original input parameter, if it does not have
- * the correct format.
- */
- public static function removeSecondsFromTime($p_dateTime)
- {
- //Format is in hh:mm:ss. We want hh:mm
- $timeExplode = explode(":", $p_dateTime);
- if (count($timeExplode) == 3)
- return $timeExplode[0].":".$timeExplode[1];
- else
- return $p_dateTime;
- }
- /* Given a track length in the format HH:MM:SS.mm, we want to
- * convert this to seconds. This is useful for Liquidsoap which
- * likes input parameters give in seconds.
- * For example, 00:06:31.444, should be converted to 391.444 seconds
- * @param int $p_time
- * The time interval in format HH:MM:SS.mm we wish to
- * convert to seconds.
- * @return float
- * The input parameter converted to seconds.
- */
- public static function calculateLengthInSeconds($p_time){
- if (2 !== substr_count($p_time, ":")){
- return false;
- }
-
- if (1 === substr_count($p_time, ".")){
- list($hhmmss, $ms) = explode(".", $p_time);
- } else {
- $hhmmss = $p_time;
- $ms = 0;
- }
- list($hours, $minutes, $seconds) = explode(":", $hhmmss);
-
- $totalSeconds = ($hours*3600 + $minutes*60 + $seconds).".$ms";
- return round($totalSeconds, 3);
- }
-
- /**
- * returns true or false depending on input is wether in
- * valid range of SQL date/time
- * @param string $p_datetime
- * should be in format of '0000-00-00 00:00:00'
- */
- public static function checkDateTimeRangeForSQL($p_datetime){
- $info = explode(' ', $p_datetime);
- $dateInfo = explode('-', $info[0]);
- if (isset($info[1])) {
- $timeInfo = explode(':', $info[1]);
- }
- $retVal = array();
- $retVal["success"] = true;
-
- $year = $dateInfo[0];
- $month = $dateInfo[1];
- $day = $dateInfo[2];
- // if year is < 1753 or > 9999 it's out of range
- if ($year < 1753) {
- $retVal['success'] = false;
- $retVal['errMsg'] = sprintf(_("The year %s must be within the range of 1753 - 9999"), $year);
- } else if (!checkdate($month, $day, $year)) {
- $retVal['success'] = false;
- $retVal['errMsg'] = sprintf(_("%s-%s-%s is not a valid date"), $year, $month, $day);
- } else {
- // check time
- if (isset($timeInfo)) {
- if (isset($timeInfo[0]) && $timeInfo[0] != "") {
- $hour = intval($timeInfo[0]);
- } else {
- $hour = -1;
- }
-
- if (isset($timeInfo[1]) && $timeInfo[1] != "") {
- $min = intval($timeInfo[1]);
- } else {
- $min = -1;
- }
-
- if (isset($timeInfo[2]) && $timeInfo[2] != "") {
- $sec = intval($timeInfo[2]);
- } else {
- $sec = -1;
- }
-
- if ( ($hour < 0 || $hour > 23) || ($min < 0 || $min > 59) || ($sec < 0 || $sec > 59) ) {
- $retVal['success'] = false;
- $retVal['errMsg'] = sprintf(_("%s:%s:%s is not a valid time"), $timeInfo[0], $timeInfo[1] ,$timeInfo[2]);
- }
- }
- }
- return $retVal;
- }
-
- /*
- * @param $datetime string Y-m-d H:i:s in UTC timezone
- *
- * @return string in $format default Y-m-d H:i:s in station timezone
- */
- public static function UTCStringToStationTimezoneString($datetime, $format="Y-m-d H:i:s") {
- $stationTimezone = new DateTimeZone(Application_Model_Preference::GetDefaultTimezone());
- $utcTimezone = new DateTimeZone("UTC");
-
- $d = new DateTime($datetime, $utcTimezone);
- $d->setTimezone($stationTimezone);
-
- return $d->format($format);
- }
-
- /*
- * @param $datetime string Y-m-d H:i:s in UTC timezone
- *
- * @return string Y-m-d H:i:s in user's timezone
- */
- public static function UTCStringToUserTimezoneString($datetime, $format="Y-m-d H:i:s") {
- $userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone());
- $utcTimezone = new DateTimeZone("UTC");
-
- $d = new DateTime($datetime, $utcTimezone);
- $d->setTimezone($userTimezone);
-
- return $d->format($format);
- }
-
- /*
- * @param $datetime string Y-m-d H:i:s in user timezone
- *
- * @return string Y-m-d H:i:s in UTC timezone
- */
- public static function UserTimezoneStringToUTCString($datetime, $format="Y-m-d H:i:s") {
- $userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone());
- $utcTimezone = new DateTimeZone("UTC");
-
- $d = new DateTime($datetime, $userTimezone);
- $d->setTimezone($utcTimezone);
-
- return $d->format($format);
- }
-
- /**
- * Convert the columns given in the array $columnsToConvert in the
- * database result $rows to local timezone.
- *
- * @param array $rows arrays of arrays containing database query result
- * @param array $columnsToConvert array of column names to convert
- * @param string (station|user) convert to either station or user timezone.
- */
- public static function convertTimestamps(&$rows, $columnsToConvert, $domain="station")
- {
- if (!is_array($rows)) {
- return;
- }
-
- $converter = "UTCStringTo".ucfirst($domain)."TimezoneString";
-
- foreach ($rows as &$row) {
- foreach ($columnsToConvert as $column) {
- $row[$column] = self::$converter($row[$column]);
- }
- }
- }
-
- /**
- * Convert the columns given in the array $columnsToConvert in the
- * database result $rows to local timezone.
- *
- * @param array $rows arrays of arrays containing database query result
- * @param array $columnsToConvert array of column names to convert
- * @param string $timezone convert to the given timezone.
- * @param string $format time format to convert to
- */
- public static function convertTimestampsToTimezone(&$rows, $columnsToConvert, $timezone, $format="Y-m-d H:i:s")
- {
- $timezone = strtolower($timezone);
- // Check that the timezone is valid and rows is an array
- if (!is_array($rows)) {
- return;
- }
-
- foreach ($rows as &$row) {
- if (is_array($row)) {
- foreach ($columnsToConvert as $column) {
- if (array_key_exists($column, $row)) {
- $newTimezone = new DateTimeZone($timezone);
- $utcTimezone = new DateTimeZone("UTC");
-
- $d = new DateTime($row[$column], $utcTimezone);
- $d->setTimezone($newTimezone);
- $row[$column] = $d->format($format);
- }
- }
- self::convertTimestampsToTimezone($row, $columnsToConvert, $timezone, $format);
- }
- }
- }
-
- /**
- * Return the end date time in the given timezone
- *
- * @return DateTime
- */
- public static function getEndDateTime($timezoneString, $days)
- {
- $timezone = new DateTimeZone($timezoneString);
- $now = new DateTime("now", $timezone);
-
- $now->add(new DateInterval("P".$days."D"));
- $now->setTime(0, 0, 0);
-
- return $now;
- }
-
- /**
- * Return a formatted string representing the
- * given datetime in the given timezone
- *
- * @param unknown $datetime the time to convert
- * @param unknown $timezone the timezone to convert to
- * @param string $format the formatted string
- */
- public static function UTCStringToTimezoneString($datetime, $timezone, $format="Y-m-d H:i:s") {
- $d = new DateTime($datetime, new DateTimeZone("UTC"));
- $timezone = strtolower($timezone);
- $newTimezone = new DateTimeZone($timezone);
- $d->setTimezone($newTimezone);
-
- return $d->format($format);
- }
-
- /**
- * Return the timezone offset in seconds for the given timezone
- *
- * @param unknown $userDefinedTimezone the timezone used to determine the offset
- */
- public static function getTimezoneOffset($userDefinedTimezone) {
- $now = new DateTimeZone($userDefinedTimezone);
-
- $d = new DateTime("now", $now);
- return $d->format("Z");
- }
-
-
- /**
- * This function is used for calculations! Don't modify for display purposes!
- *
- * Convert playlist time value to float seconds
- *
- * @param string $plt
- * playlist interval value (HH:mm:ss.dddddd)
- * @return int
- * seconds
- */
- public static function playlistTimeToSeconds($plt)
- {
- $arr = preg_split('/:/', $plt);
- if (isset($arr[2])) {
- return (intval($arr[0])*60 + intval($arr[1]))*60 + floatval($arr[2]);
- }
- if (isset($arr[1])) {
- return intval($arr[0])*60 + floatval($arr[1]);
- }
-
- return floatval($arr[0]);
- }
-
-
- /**
- * This function is used for calculations! Don't modify for display purposes!
- *
- * Convert float seconds value to playlist time format
- *
- * @param float $seconds
- * @return string
- * interval in playlist time format (HH:mm:ss.d)
- */
- public static function secondsToPlaylistTime($p_seconds)
- {
- $info = explode('.', $p_seconds);
- $seconds = $info[0];
- if (!isset($info[1])) {
- $milliStr = 0;
- } else {
- $milliStr = $info[1];
- }
- $hours = floor($seconds / 3600);
- $seconds -= $hours * 3600;
- $minutes = floor($seconds / 60);
- $seconds -= $minutes * 60;
-
- $res = sprintf("%02d:%02d:%02d.%s", $hours, $minutes, $seconds, $milliStr);
-
- return $res;
- }
- /**
- * Returns date fields from give start and end teimstamp strings
- * if no start or end parameter is passed start will be set to 1
- * in the past and end to now
- *
- * @param string startTimestamp Y-m-d H:i:s
- * @param string endTImestamp Y-m-d H:i:s
- * @param string timezone (ex UTC) of the start and end parameters
- * @return array (start DateTime, end DateTime) in UTC timezone
- */
- public static function getStartEnd($startTimestamp, $endTimestamp, $timezone)
- {
- $prefTimezone = Application_Model_Preference::GetTimezone();
- $utcTimezone = new DateTimeZone("UTC");
- $utcNow = new DateTime("now", $utcTimezone);
- if (empty($timezone)) {
- $userTimezone = new DateTimeZone($prefTimezone);
- } else {
- $userTimezone = new DateTimeZone($timezone);
- }
- // default to 1 day
- if (empty($startTimestamp) || empty($endTimestamp)) {
- $startsDT = clone $utcNow;
- $startsDT->sub(new DateInterval("P1D"));
- $endsDT = clone $utcNow;
- } else {
-
- try {
- $startsDT = new DateTime($startTimestamp, $userTimezone);
- $startsDT->setTimezone($utcTimezone);
-
- $endsDT = new DateTime($endTimestamp, $userTimezone);
- $endsDT->setTimezone($utcTimezone);
-
- if ($startsDT > $endsDT) {
- throw new Exception("start greater than end");
- }
- }
- catch (Exception $e) {
- Logging::info($e);
- Logging::info($e->getMessage());
-
- $startsDT = clone $utcNow;
- $startsDT->sub(new DateInterval("P1D"));
- $endsDT = clone $utcNow;
- }
-
- }
-
- return array($startsDT, $endsDT);
- }
- }
|