diff --git a/core/core.services.yml b/core/core.services.yml index db1e3da..e49da7f 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -449,3 +449,6 @@ services: country_manager: class: Drupal\Core\Locale\CountryManager arguments: ['@module_handler'] + date: + class: Drupal\Core\Datetime\Date + arguments: ['@config.factory', '@language_manager'] diff --git a/core/includes/common.inc b/core/includes/common.inc index 1e9b54f..5387f71 100644 --- a/core/includes/common.inc +++ b/core/includes/common.inc @@ -1273,50 +1273,11 @@ function format_interval($interval, $granularity = 2, $langcode = NULL) { * * @return * A translated date string in the requested format. + * + * @see \Drupal\Component\Datetime\Date::format() */ function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) { - // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static_fast; - if (!isset($drupal_static_fast)) { - $drupal_static_fast['timezones'] = &drupal_static(__FUNCTION__); - } - $timezones = &$drupal_static_fast['timezones']; - - if (!isset($timezone)) { - $timezone = date_default_timezone_get(); - } - // Store DateTimeZone objects in an array rather than repeatedly - // constructing identical objects over the life of a request. - if (!isset($timezones[$timezone])) { - $timezones[$timezone] = timezone_open($timezone); - } - - if (empty($langcode)) { - $langcode = language(Language::TYPE_INTERFACE)->langcode; - } - - // Create a DrupalDateTime object from the timestamp and timezone. - $date = new DrupalDateTime($timestamp, $timezones[$timezone]); - - // Find the appropriate format type. - $key = $date->canUseIntl() ? DrupalDateTime::INTL : DrupalDateTime::PHP; - - // If we have a non-custom date format use the provided date format pattern. - if ($type != 'custom') { - $format = config('system.date')->get('formats.' . $type . '.pattern.' . $key); - } - - // Fall back to medium if a format was not found. - if (empty($format)) { - $format = config('system.date')->get('formats.medium.pattern.' . $key); - } - - // Call $date->format(). - $settings = array( - 'langcode' => $langcode, - 'format_string_type' => $key, - ); - return filter_xss_admin($date->format($format, $settings)); + return Drupal::service('date')->format($timestamp, $type, $format, $timezone, $langcode); } /** diff --git a/core/lib/Drupal/Core/Datetime/Date.php b/core/lib/Drupal/Core/Datetime/Date.php new file mode 100644 index 0000000..93fd00f --- /dev/null +++ b/core/lib/Drupal/Core/Datetime/Date.php @@ -0,0 +1,124 @@ +configFactory = $config_factory; + $this->languageManager = $language_manager; + } + + /** + * Formats a date, using a date type or a custom date format string. + * + * @param int $timestamp + * A UNIX timestamp to format. + * @param string $type + * (optional) The format to use, one of: + * - One of the built-in formats: 'short', 'medium', + * 'long', 'html_datetime', 'html_date', 'html_time', + * 'html_yearless_date', 'html_week', 'html_month', 'html_year'. + * - The name of a date type defined by a module in + * hook_date_format_types(), if it's been assigned a format. + * - The machine name of an administrator-defined date format. + * - 'custom', to use $format. + * Defaults to 'medium'. + * @param string $format + * (optional) If $type is 'custom', a PHP date format string suitable for + * input to date(). Use a backslash to escape ordinary text, so it does not + * get interpreted as date format characters. + * @param string $timezone + * (optional) Time zone identifier, as described at + * http://php.net/manual/timezones.php Defaults to the time zone used to + * display the page. + * @param string $langcode + * (optional) Language code to translate to. Defaults to the language used to + * display the page. + * + * @return string + * A translated date string in the requested format. + */ + public function format($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) { + if (!isset($timezone)) { + $timezone = date_default_timezone_get(); + } + // Store DateTimeZone objects in an array rather than repeatedly + // constructing identical objects over the life of a request. + if (!isset($this->timezones[$timezone])) { + $this->timezones[$timezone] = timezone_open($timezone); + } + + if (empty($langcode)) { + $langcode = $this->languageManager->getLanguage(Language::TYPE_INTERFACE)->langcode; + } + + // Create a DrupalDateTime object from the timestamp and timezone. + $date = new DrupalDateTime($timestamp, $this->timezones[$timezone]); + + // Find the appropriate format type. + $key = $date->canUseIntl() ? DrupalDateTime::INTL : DrupalDateTime::PHP; + + // If we have a non-custom date format use the provided date format pattern. + $config = $this->configFactory->get('system.date'); + if ($type != 'custom') { + $format = $config->get('formats.' . $type . '.pattern.' . $key); + } + + // Fall back to medium if a format was not found. + if (empty($format)) { + $format = $config->get('formats.medium.pattern.' . $key); + } + + // Call $date->format(). + $settings = array( + 'langcode' => $langcode, + 'format_string_type' => $key, + ); + return Xss::filter($date->format($format, $settings)); + } + +}