mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-10-31 11:24:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			256 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /* Icinga Web 2 | (c) 2013-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
 | |
|      *
 | |
|      * @return  array
 | |
|      */
 | |
|     protected static function diff($time)
 | |
|     {
 | |
|         $invert = false;
 | |
|         $now = time();
 | |
|         $time = (float) $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('M j', $time);
 | |
|             } else {
 | |
|                 $formatted = date('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', (float) $date);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Format date and time
 | |
|      *
 | |
|      * @param   int|float $dateTime
 | |
|      *
 | |
|      * @return  string
 | |
|      */
 | |
|     public static function formatDateTime($dateTime)
 | |
|     {
 | |
|         return date('Y-m-d H:i:s', (float) $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', (float) $time);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Format time as time ago
 | |
|      *
 | |
|      * @param   int|float   $time
 | |
|      * @param   bool        $timeOnly
 | |
|      *
 | |
|      * @return  string
 | |
|      */
 | |
|     public static function timeAgo($time, $timeOnly = false)
 | |
|     {
 | |
|         list($type, $ago, $invert) = static::diff($time);
 | |
|         if ($timeOnly) {
 | |
|             return $ago;
 | |
|         }
 | |
|         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
 | |
|      *
 | |
|      * @return  string
 | |
|      */
 | |
|     public static function timeSince($time, $timeOnly = false)
 | |
|     {
 | |
|         list($type, $since, $invert) = static::diff($time);
 | |
|         if ($timeOnly) {
 | |
|             return $since;
 | |
|         }
 | |
|         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
 | |
|      *
 | |
|      * @return  string
 | |
|      */
 | |
|     public static function timeUntil($time, $timeOnly = false)
 | |
|     {
 | |
|         list($type, $until, $invert) = static::diff($time);
 | |
|         if ($invert && $type === static::RELATIVE) {
 | |
|             $until = '-' . $until;
 | |
|         }
 | |
|         if ($timeOnly) {
 | |
|             return $until;
 | |
|         }
 | |
|         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;
 | |
|     }
 | |
| }
 |