Index: core/install/cache/class_structure.php =================================================================== --- core/install/cache/class_structure.php +++ core/install/cache/class_structure.php @@ -44,6 +44,7 @@ 'CustomDataEventHandler' => '/core/units/custom_data/custom_data_event_handler.php', 'CustomFieldsEventHandler' => '/core/units/custom_fields/custom_fields_event_handler.php', 'CustomFieldsTagProcessor' => '/core/units/custom_fields/custom_fields_tag_processor.php', + 'DateHelper' => '/core/units/helpers/date_helper.php', 'Debugger' => '/core/kernel/utility/debugger.php', 'DebuggerUtil' => '/core/kernel/utility/debugger.php', 'DeploymentHelper' => '/core/units/helpers/deployment_helper.php', @@ -604,6 +605,13 @@ 0 => 'kDBTagProcessor', ), ), + 'DateHelper' => array( + 'type' => 1, + 'modifiers' => 0, + 'extends' => array( + 0 => 'kHelper', + ), + ), 'Debugger' => array( 'type' => 1, 'modifiers' => 0, Index: core/install/english.lang =================================================================== --- core/install/english.lang +++ core/install/english.lang @@ -1753,6 +1753,7 @@ V2luZG93cw== eWVhcg== WWVz + YWdv U3ViLXNlY3Rpb25zIFF1YW50aXR5 TmF2aWdhdGlvbiBCYXI= UmF0aW5n @@ -1785,6 +1786,7 @@ SXRlbSBJcyBhIFRvcCBTZWxsZXI= VVJM b2Y= + c2luY2U= SW52YWxpZA== Tm90IFZhbGlkYXRlZA== VmFsaWQ= Index: core/kernel/utility/formatters/date_formatter.php =================================================================== --- core/kernel/utility/formatters/date_formatter.php +++ core/kernel/utility/formatters/date_formatter.php @@ -24,6 +24,13 @@ var $language = null; /** + * Date helper. + * + * @var DateHelper + */ + protected $dateHelper; + + /** * Create date formatter * * @access public @@ -290,9 +297,39 @@ $format = trim($format, $dt_separator); } + if ( preg_match('/^relative(.*)/', $options['format'], $regs) ) { + $detalization_level = trim($regs[1], ':'); + + return $this->relativeFormat($value, ($detalization_level < 1) ? 1 : $detalization_level); + } + return date($format, $value); } + /** + * Formats value as relation to current time. + * + * @param integer $from Date. + * @param integer $level_of_detail Level of details. + * + * @return string + */ + protected function relativeFormat($from, $level_of_detail) + { + if ( !isset($this->dateHelper) ) { + $this->dateHelper = $this->Application->recallObject('DateHelper'); + } + + if ( $from == TIMENOW ) { + $from = TIMENOW - 1; + } + + $suffix = $this->Application->Phrase($from > TIMENOW ? 'lc_since' : 'lc_ago'); + $res = $this->dateHelper->getHumanTime(abs($from - TIMENOW), $level_of_detail); + + return $res . ' ' . $suffix; + } + function HumanFormat($format) { $patterns = Array('/m/', Index: core/units/helpers/date_helper.php =================================================================== --- /dev/null +++ core/units/helpers/date_helper.php @@ -0,0 +1,81 @@ + 29030400, // Seconds in a year (12 months). + 'month' => 2419200, // Seconds in a month (4 weeks). + 'week' => 604800, // Seconds in a week (7 days). + 'day' => 86400, // Seconds in a day (24 hours). + 'hour' => 3600, // Seconds in an hour (60 minutes). + 'minute' => 60, // Seconds in a minute (60 seconds). + 'second' => 1, // 1 second. + ); + + $res = ''; + $current_detalization_level = 0; + + foreach ( $units as $unit => $multiplier ) { + if ( $seconds >= $multiplier ) { + $and = (!$res || $multiplier != 1) ? '' : 'and '; + $res .= ', ' . $and . intval($seconds / $multiplier); + $res .= ' ' . $unit . (intval($seconds / $multiplier) == 1 ? '' : 's'); + $seconds -= intval($seconds / $multiplier) * $multiplier; + $current_detalization_level++; + + if ( $current_detalization_level >= $detalization_level ) { + break; + } + } + } + + return substr($res, strlen(', ')); + } + + /** + * Returns human representation of given seconds in short format (e.g. `12d 5h`). + * + * @param integer $seconds Seconds. + * + * @return string + */ + public function getShortHumanTime($seconds) + { + // Using "DateInterval" class directly will lose 61+ second. + $now = new DateTime(); + $futher_date = new DateTime(); + $now->setTimestamp(0); + $futher_date->setTimestamp($seconds); + $interval = $futher_date->diff($now); + + $ret = $interval->format(' %yy %mm %dd %hh %imi %ss'); + + return trim(preg_replace('/ 0\w+/', '', $ret)); + } + +}