diff options
Diffstat (limited to '')
-rw-r--r-- | library/Icinga/Date/DateFormatter.php | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/library/Icinga/Date/DateFormatter.php b/library/Icinga/Date/DateFormatter.php new file mode 100644 index 0000000..867462a --- /dev/null +++ b/library/Icinga/Date/DateFormatter.php @@ -0,0 +1,265 @@ +<?php +/* Icinga Web 2 | (c) 2015 Icinga Development Team | GPLv2+ */ + +namespace Icinga\Date; + +/** + * Date formatting + */ +class DateFormatter +{ + /** + * Format relative + * + * @var int + */ + const RELATIVE = 0; + + /** + * Format time + * + * @var int + */ + const TIME = 1; + + /** + * Format date + * + * @var int + */ + const DATE = 2; + + /** + * Format date and time + * + * @var int + */ + const DATETIME = 4; + + /** + * Get the diff between the given time and the current time + * + * @param int|float $time + * @param bool $requireTime + * + * @return array + */ + protected static function diff($time, $requireTime = false) + { + $invert = false; + $now = time(); + $time = (int) $time; + $diff = $time - $now; + if ($diff < 0) { + $diff = abs($diff); + $invert = true; + } + if ($diff > 3600 * 24 * 3) { + $type = static::DATE; + if (date('Y') === date('Y', $time)) { + $formatted = date($requireTime ? 'M j H:i' : 'M j', $time); + } else { + $formatted = date($requireTime ? 'Y-m-d H:i' : 'Y-m', $time); + } + } else { + $minutes = floor($diff / 60); + if ($minutes < 60) { + $type = static::RELATIVE; + $formatted = sprintf('%dm %ds', $minutes, $diff % 60); + } else { + $hours = floor($minutes / 60); + if ($hours < 24) { + if (date('d') === date('d', $time)) { + $type = static::TIME; + $formatted = date('H:i', $time); + } else { + $type = static::DATE; + $formatted = date('M j H:i', $time); + } + } else { + $type = static::RELATIVE; + $formatted = sprintf('%dd %dh', floor($hours / 24), $hours % 24); + } + } + } + return array($type, $formatted, $invert); + } + + /** + * Format date + * + * @param int|float $date + * + * @return string + */ + public static function formatDate($date) + { + return date('Y-m-d', (int) $date); + } + + /** + * Format date and time + * + * @param int|float $dateTime + * + * @return string + */ + public static function formatDateTime($dateTime) + { + return date('Y-m-d H:i:s', (int) $dateTime); + } + + /** + * Format a duration + * + * @param int|float $seconds Duration in seconds + * + * @return string + */ + public static function formatDuration($seconds) + { + $minutes = floor((float) $seconds / 60); + if ($minutes < 60) { + $formatted = sprintf('%dm %ds', $minutes, $seconds % 60); + } else { + $hours = floor($minutes / 60); + if ($hours < 24) { + $formatted = sprintf('%dh %dm', $hours, $minutes % 60); + } else { + $formatted = sprintf('%dd %dh', floor($hours / 24), $hours % 24); + } + } + return $formatted; + } + + /** + * Format time + * + * @param int|float $time + * + * @return string + */ + public static function formatTime($time) + { + return date('H:i:s', (int) $time); + } + + /** + * Format time as time ago + * + * @param int|float $time + * @param bool $timeOnly + * @param bool $requireTime + * + * @return ?string + */ + public static function timeAgo($time, $timeOnly = false, $requireTime = false) + { + list($type, $ago, $invert) = static::diff($time, $requireTime); + if ($timeOnly) { + return $ago; + } + + $formatted = null; + switch ($type) { + case static::DATE: + // Move to next case + case static::DATETIME: + $formatted = sprintf( + t('on %s', 'An event happened on the given date or date and time'), + $ago + ); + break; + case static::RELATIVE: + $formatted = sprintf( + t('%s ago', 'An event that happened the given time interval ago'), + $ago + ); + break; + case static::TIME: + $formatted = sprintf(t('at %s', 'An event happened at the given time'), $ago); + break; + } + return $formatted; + } + + /** + * Format time as time since + * + * @param int|float $time + * @param bool $timeOnly + * @param bool $requireTime + * + * @return ?string + */ + public static function timeSince($time, $timeOnly = false, $requireTime = false) + { + list($type, $since, $invert) = static::diff($time, $requireTime); + if ($timeOnly) { + return $since; + } + + $formatted = null; + switch ($type) { + case static::RELATIVE: + $formatted = sprintf( + t('for %s', 'A status is lasting for the given time interval'), + $since + ); + break; + case static::DATE: + // Move to next case + case static::DATETIME: + // Move to next case + case static::TIME: + $formatted = sprintf( + t('since %s', 'A status is lasting since the given time, date or date and time'), + $since + ); + break; + } + return $formatted; + } + + /** + * Format time as time until + * + * @param int|float $time + * @param bool $timeOnly + * @param bool $requireTime + * + * @return ?string + */ + public static function timeUntil($time, $timeOnly = false, $requireTime = false) + { + list($type, $until, $invert) = static::diff($time, $requireTime); + if ($invert && $type === static::RELATIVE) { + $until = '-' . $until; + } + if ($timeOnly) { + return $until; + } + + $formatted = null; + switch ($type) { + case static::DATE: + // Move to next case + case static::DATETIME: + $formatted = sprintf( + t('on %s', 'An event will happen on the given date or date and time'), + $until + ); + break; + case static::RELATIVE: + $formatted = sprintf( + t('in %s', 'An event will happen after the given time interval has elapsed'), + $until + ); + break; + case static::TIME: + $formatted = sprintf(t('at %s', 'An event will happen at the given time'), $until); + break; + } + return $formatted; + } +} |