Index: core/install/english.lang =================================================================== --- core/install/english.lang +++ core/install/english.lang @@ -1747,6 +1747,7 @@ V2luZG93cw== eWVhcg== WWVz + YWdv U3ViLXNlY3Rpb25zIFF1YW50aXR5 TmF2aWdhdGlvbiBCYXI= UmF0aW5n @@ -1779,6 +1780,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 @@ -264,6 +264,12 @@ $options['format'] = $options['input_format']; } + if ( preg_match('/^relative(.*)/', $options['format'], $regs) ) { + $detalization_level = trim($regs[1], ':'); + + return $this->RelativeFormat($value, ($detalization_level < 1) ? 1 : $detalization_level); + } + if (!$options['use_timezone']) { return gmdate($options['format'], $value); } @@ -278,6 +284,53 @@ return date($format, $value); } + /** + * Formats value as relation to current time; + * + * @param integer $from Date. + * @param integer $detalization_level Detalization level. + * + * @return string + */ + protected function RelativeFormat($from, $detalization_level) + { + if ( $from == TIMENOW ) { + $from = TIMENOW - 1; + } + + $units = array( + 'year' => 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. + ); + + $diff = abs($from - TIMENOW); + $res = ''; + $current_detalization_level = 0; + + foreach ( $units as $unit => $multiplier ) { + if ( $diff >= $multiplier ) { + $and = (!$res || $multiplier != 1) ? '' : 'and '; + $res .= ', ' . $and . intval($diff / $multiplier); + $res .= ' ' . $unit . (intval($diff / $multiplier) == 1 ? '' : 's'); + $diff -= intval($diff / $multiplier) * $multiplier; + $current_detalization_level++; + + if ( $current_detalization_level >= $detalization_level ) { + break; + } + } + } + + $suffix = $this->Application->Phrase($from > TIMENOW ? 'lc_since' : 'lc_ago'); + + return substr($res . ' ' . $suffix, strlen(', ')); + } + function HumanFormat($format) { $patterns = Array('/m/', @@ -506,4 +559,4 @@ { return $this->Format( time(), $field, $object, $options['input_format']); } -} \ No newline at end of file +}