timezone. * Fixed GetPlayOrderRange to be consistently return everything in UTC. * ApiController liveInfoAction now returns everything consistently in the station timezone. This fixes negative remaining time that could occur in the embeddable JS Airtime widgets if you were logged in to Airtime while you viewed your website. (The widgets display in the browser's local time.) * ScheduleController getCurrentPlaylistAction() returns everything consistently in the user timezone now.
367 lines
11 KiB
PHP
367 lines
11 KiB
PHP
<?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]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
}
|
|
|