2011-01-31 03:24:57 +01:00
|
|
|
<?php
|
|
|
|
|
2012-08-15 19:45:06 +02:00
|
|
|
function phabricator_date($epoch, PhabricatorUser $user) {
|
2012-04-02 23:45:07 +02:00
|
|
|
return phabricator_format_local_time(
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
$epoch,
|
|
|
|
$user,
|
2015-01-04 20:37:48 +01:00
|
|
|
phutil_date_format($epoch));
|
2011-06-18 22:07:02 +02:00
|
|
|
}
|
|
|
|
|
2012-03-28 03:16:59 +02:00
|
|
|
function phabricator_relative_date($epoch, $user, $on = false) {
|
|
|
|
static $today;
|
|
|
|
static $yesterday;
|
|
|
|
|
|
|
|
if (!$today || !$yesterday) {
|
|
|
|
$now = time();
|
|
|
|
$today = phabricator_date($now, $user);
|
|
|
|
$yesterday = phabricator_date($now - 86400, $user);
|
|
|
|
}
|
|
|
|
|
|
|
|
$date = phabricator_date($epoch, $user);
|
|
|
|
|
|
|
|
if ($date === $today) {
|
|
|
|
return 'today';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($date === $yesterday) {
|
|
|
|
return 'yesterday';
|
|
|
|
}
|
|
|
|
|
|
|
|
return (($on ? 'on ' : '').$date);
|
|
|
|
}
|
|
|
|
|
2011-06-18 22:07:02 +02:00
|
|
|
function phabricator_time($epoch, $user) {
|
2012-04-02 23:45:07 +02:00
|
|
|
return phabricator_format_local_time(
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
$epoch,
|
|
|
|
$user,
|
2015-01-04 20:34:23 +01:00
|
|
|
phabricator_time_format($user));
|
2011-06-18 22:07:02 +02:00
|
|
|
}
|
|
|
|
|
2012-06-29 03:08:59 +02:00
|
|
|
function phabricator_datetime($epoch, $user) {
|
2012-04-02 23:45:07 +02:00
|
|
|
return phabricator_format_local_time(
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
$epoch,
|
|
|
|
$user,
|
2013-09-02 21:40:04 +02:00
|
|
|
pht('%s, %s',
|
2015-01-04 20:37:48 +01:00
|
|
|
phutil_date_format($epoch),
|
2015-01-04 20:34:23 +01:00
|
|
|
phabricator_time_format($user)));
|
2012-03-21 23:04:49 +01:00
|
|
|
}
|
|
|
|
|
2015-01-04 20:34:23 +01:00
|
|
|
function phabricator_time_format($user) {
|
2013-09-02 21:40:04 +02:00
|
|
|
$prefs = $user->loadPreferences();
|
|
|
|
|
|
|
|
$pref = $prefs->getPreference(
|
|
|
|
PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT);
|
|
|
|
|
|
|
|
if (strlen($pref)) {
|
|
|
|
return $pref;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pht('g:i A');
|
|
|
|
}
|
|
|
|
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
/**
|
2012-04-02 23:45:07 +02:00
|
|
|
* This function does not usually need to be called directly. Instead, call
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
* @{function:phabricator_date}, @{function:phabricator_time}, or
|
|
|
|
* @{function:phabricator_datetime}.
|
|
|
|
*
|
|
|
|
* @param int Unix epoch timestamp.
|
|
|
|
* @param PhabricatorUser User viewing the timestamp.
|
|
|
|
* @param string Date format, as per DateTime class.
|
|
|
|
* @return string Formatted, local date/time.
|
|
|
|
*/
|
2012-04-02 23:45:07 +02:00
|
|
|
function phabricator_format_local_time($epoch, $user, $format) {
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
if (!$epoch) {
|
|
|
|
// If we're missing date information for something, the DateTime class will
|
|
|
|
// throw an exception when we try to construct an object. Since this is a
|
|
|
|
// display function, just return an empty string.
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
|
|
|
$user_zone = $user->getTimezoneIdentifier();
|
|
|
|
|
|
|
|
static $zones = array();
|
|
|
|
if (empty($zones[$user_zone])) {
|
|
|
|
$zones[$user_zone] = new DateTimeZone($user_zone);
|
|
|
|
}
|
|
|
|
$zone = $zones[$user_zone];
|
|
|
|
|
|
|
|
// NOTE: Although DateTime takes a second DateTimeZone parameter to its
|
|
|
|
// constructor, it ignores it if the date string includes timezone
|
|
|
|
// information. Further, it treats epoch timestamps ("@946684800") as having
|
|
|
|
// a UTC timezone. Set the timezone explicitly after constructing the object.
|
2012-04-18 17:02:08 +02:00
|
|
|
try {
|
|
|
|
$date = new DateTime('@'.$epoch);
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
// NOTE: DateTime throws an empty exception if the format is invalid,
|
|
|
|
// just replace it with a useful one.
|
|
|
|
throw new Exception(
|
2013-03-02 00:37:32 +01:00
|
|
|
pht("Construction of a DateTime() with epoch '%s' ".
|
|
|
|
"raised an exception.", $epoch));
|
2012-04-18 17:02:08 +02:00
|
|
|
}
|
|
|
|
|
Use phabricator_ time functions in more places
Summary:
Replace some more date() calls with locale-aware calls.
Also, at least on my system, the DateTimeZone / DateTime stuff didn't actually
work and always rendered in UTC. Fixed that.
Test Plan:
Viewed daemon console, differential revisions, files, and maniphest timestamps
in multiple timezones.
Reviewed By: toulouse
Reviewers: toulouse, fratrik, jungejason, aran, tuomaspelkonen
CC: aran, toulouse
Differential Revision: 530
2011-06-26 18:22:52 +02:00
|
|
|
$date->setTimeZone($zone);
|
Improve time localization code
Summary:
- We throw on a missing date right now, in the DateTime constructor. This can
happen in reasonable cases and this is display code, so handle it more
gracefully (see T520).
- This stuff is a little slow and we sometimes render many hundreds of dates
per page. I've been seeing it in profiles on and off. Memoize timezones to
improve performance.
- Some minor code duplication that would have become less-minor with the
constructor change, consolidate the logic.
- Add some unit tests and a little documentation.
Test Plan:
- Ran unit tests.
- Profiled 1,000 calls to phabricator_datetime(), cost dropped from ~49ms to
~19ms with addition of memoization. This is still slower than I'd like but I
don't think there's an easy way to squeeze it down further.
Reviewers: ajtrichards, jungejason, nh, tuomaspelkonen, aran
Reviewed By: ajtrichards
CC: aran, ajtrichards, epriestley
Differential Revision: 966
2011-09-27 18:03:55 +02:00
|
|
|
|
2012-06-29 03:08:59 +02:00
|
|
|
return PhutilTranslator::getInstance()->translateDate($format, $date);
|
2011-06-18 22:07:02 +02:00
|
|
|
}
|