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));
+ }
+
+}