Files
ops-Gazelle/app/Util/Time.php
itismadness 8039090a33 Build basic setup for future OOP classes/testing (!27)
Squashed commit of the following:

Author: itismadness <itismadness@apollo.rip>

    Implement new app structure
    remove unneeded migration for testing
    improve migrations
    comment out up() function for now
    add new migrations
    rename classes to singular form
    update another util function
    implement more testing
    rename test to tester
    add unit test framework
2018-01-28 22:03:49 -05:00

311 lines
7.0 KiB
PHP

<?php
namespace Gazelle\Util;
class Time {
/**
* Returns the number of seconds between now() and the inputed timestamp. If the timestamp
* is an integer, we assume that's the nubmer of seconds you wish to subtract, otherwise
* it's a string of a timestamp that we convert to a UNIX timestamp and then do a subtraction.
* If the passed in $timestamp does not convert properly or is null, return false (error).
*
* @param string|int $timestamp
* @return false|int
*/
public static function timeAgo($timestamp) {
if ($timestamp === null) {
return false;
}
if (($filter = filter_var($timestamp, FILTER_VALIDATE_INT)) === false) {
if ($timestamp == '0000-00-00 00:00:00') {
return false;
}
$timestamp = strtotime($timestamp);
if ($timestamp === false) {
return false;
}
return time() - $timestamp;
}
else {
return $filter;
}
}
public static function timeDiff($timestamp, $levels = 2, $span = true, $lowercase = false, $starttime = false) {
$starttime = ($starttime === false) ? time() : strtotime($starttime);
if (!Type::isInteger($timestamp)) { // Assume that $timestamp is SQL timestamp
if ($timestamp == '0000-00-00 00:00:00') {
return 'Never';
}
$timestamp = strtotime($timestamp);
}
if ($timestamp == 0) {
return 'Never';
}
$time = $starttime - $timestamp;
// If the time is negative, then it expires in the future.
if ($time < 0) {
$time = -$time;
$HideAgo = true;
}
$years = floor($time / 31556926); // seconds in one year
$remain = $time - $years * 31556926;
$months = floor($remain / 2629744); // seconds in one month
$remain = $remain - $months * 2629744;
$weeks = floor($remain / 604800); // seconds in one week
$remain = $remain - $weeks * 604800;
$days = floor($remain / 86400); // seconds in one day
$remain = $remain - $days * 86400;
$hours=floor($remain / 3600); // seconds in one hour
$remain = $remain - $hours * 3600;
$minutes = floor($remain / 60); // seconds in one minute
$remain = $remain - $minutes * 60;
$seconds = $remain;
$return = '';
if ($years > 0 && $levels > 0) {
if ($years > 1) {
$return .= "$years years";
} else {
$return .= "$years year";
}
$levels--;
}
if ($months > 0 && $levels > 0) {
if ($return != '') {
$return .= ', ';
}
if ($months > 1) {
$return .= "$months months";
} else {
$return .= "$months month";
}
$levels--;
}
if ($weeks > 0 && $levels > 0) {
if ($return != '') {
$return .= ', ';
}
if ($weeks > 1) {
$return .= "$weeks weeks";
} else {
$return .= "$weeks week";
}
$levels--;
}
if ($days > 0 && $levels > 0) {
if ($return != '') {
$return .= ', ';
}
if ($days > 1) {
$return .= "$days days";
} else {
$return .= "$days day";
}
$levels--;
}
if ($hours > 0 && $levels > 0) {
if ($return != '') {
$return .= ', ';
}
if ($hours > 1) {
$return .= "$hours hours";
} else {
$return .= "$hours hour";
}
$levels--;
}
if ($minutes > 0 && $levels > 0) {
if ($return != '') {
$return .= ' and ';
}
if ($minutes > 1) {
$return .= "$minutes mins";
} else {
$return .= "$minutes min";
}
}
if ($return == '') {
$return = 'Just now';
} elseif (!isset($HideAgo)) {
$return .= ' ago';
}
if ($lowercase) {
$return = strtolower($return);
}
if ($span) {
return '<span class="time tooltip" title="'.date('M d Y, H:i', $timestamp).'">'.$return.'</span>';
} else {
return $return;
}
}
public static function convertHours($hours, $levels = 2, $span = true) {
if ($hours === 0) {
return 'Never';
}
$years = floor($hours/8760); // hours in a year
$remain = $hours - $years*8760;
$months = floor($remain/730); // hours in a month
$remain = $remain - $months*730;
$weeks = floor($remain/168); // hours in a week
$remain = $remain - $weeks*168;
$days = floor($remain/24); // hours in a day
$remain = $remain - $days*24;
$hours = floor($remain);
$return = '';
if ($years > 0 && $levels > 0) {
$return .= $years.'y';
$levels--;
}
if ($months > 0 && $levels > 0) {
$return .= $months.'mo';
$levels--;
}
if ($weeks > 0 && $levels > 0) {
$return .= $weeks.'w';
$levels--;
}
if ($days > 0 && $levels > 0) {
$return .= $days.'d';
$levels--;
}
if ($hours > 0 && $levels > 0) {
$return .= $hours.'h';
}
if ($span) {
return '<span>'.$return.'</span>';
}
else {
return $return;
}
}
/**
* Utility function to generate a timestamp to insert into the database, given some offset and
* whether or not we will be 'fuzzy' (midnight for time) with the timestamp.
*
* @param int $offset
* @param bool $fuzzy
* @return false|string
*/
public static function timeOffset($offset = 0, $fuzzy = false) {
if ($fuzzy) {
return date('Y-m-d 00:00:00', time() + $offset);
}
else {
return date('Y-m-d H:i:s', time() + $offset);
}
}
/**
* Legacy function from classes/time.class.php.
*
* @see Time::timeOffset()
* @deprecated Use Time::timeOffset() instead.
*
* @param int $offset
* @return false|string
*/
public static function timePlus($offset = 0) {
return static::timeOffset($offset);
}
/**
* Legacy function from classes/time.class.php.
*
* @see Time::timeOffset()
* @deprecated Use Time::timeOffset() instead.
*
* @param int $offset
* @param bool $fuzzy
* @return false|string
*/
public static function timeMinus($offset = 0, $fuzzy = false) {
return static::timeOffset(-$offset, $fuzzy);
}
public static function sqlTime($timestamp = false) {
if ($timestamp === false) {
$timestamp = time();
}
return date('Y-m-d H:i:s', $timestamp);
}
public static function validDate($date_string) {
$date_time = explode(' ', $date_string);
if (count($date_time) != 2) {
return false;
}
list($date, $time) = $date_time;
$split_time = explode(':', $time);
if (count($split_time) != 3) {
return false;
}
list($hour, $minute, $second) = $split_time;
if ($hour != 0 && !(is_number($hour) && $hour < 24 && $hour >= 0)) {
return false;
}
if ($minute != 0 && !(is_number($minute) && $minute < 60 && $minute >= 0)) {
return false;
}
if ($second != 0 && !(is_number($second) && $second < 60 && $second >= 0)) {
return false;
}
$split_date = explode('-', $date);
if (count($split_date) != 3) {
return false;
}
list($year, $month, $day) = $split_date;
return checkDate($month, $day, $year);
}
public static function isValidDate($date) {
return static::isValidDateTime($date, 'Y-m-d');
}
public static function isDate($date) {
list($year, $month, $day) = explode('-', $date);
return checkdate($month, $day, $year);
}
public static function isValidTime($time) {
return static::isValidDateTime($time, 'H:i');
}
public static function isValidDateTime($date_time, $format = 'Y-m-d H:i') {
$formatted_date_time = DateTime::createFromFormat($format, $date_time);
return $formatted_date_time && $formatted_date_time->format($format) == $date_time;
}
}