Преобразование меток времени в местное время с датой l18n()
У меня есть задание cron WordPress, которое периодически отправляет электронное письмо и сохраняет отметку времени, когда оно было отправлено, в качестве опции, и я хотел бы отобразить дату на странице настроек. Что-то вроде "Последнее электронное письмо было отправлено на "x"". Я нахожусь на западном побережье США, так что наше время в настоящее время в семи часах от UTC.
Мой ожидаемый результат от date_i18n(), передающий ему метку времени, будет локально отформатированной датой с семичасовой корректировкой по UTC. Однако, это возвращает время в UTC. Даже попытка получить текущее время не возвращает того, что, по моему мнению, было бы ожидаемым результатом.
Например: echo date_i18n('F d, Y H:i');
вывод 05 апреля 2013 г. 11:36, как и ожидалось, но echo date_i18n('F d, Y H:i',time());
выводит апрель 05, 2013 18:36.
Намеренно ли это? Как я могу вернуть локально отформатированную дату из ранее существовавшей отметки времени? Спасибо за любую помощь.
6 answers
Я знаю, что опоздал на три месяца, но функция, которую вы хотите здесь, - это WordPress' get_date_from_gmt()
.
Функция принимает дату GMT/UTC в формате Y-m-d H:i:s
в качестве первого параметра и желаемый формат даты в качестве второго параметра. Он преобразует вашу дату в местный часовой пояс, как указано на экране настроек.
Пример использования:
echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );
Из кодекса:
Current_time ('отметка времени') следует использовать вместо time() для возврата местного времени блога. В WordPress время PHP() всегда будет возвращаться UTC и совпадает с вызовом current_time ("отметка времени", true).
Попробуйте это:
define( 'MY_TIMEZONE', (get_option( 'timezone_string' ) ? get_option( 'timezone_string' ) : date_default_timezone_get() ) );
date_default_timezone_set( MY_TIMEZONE );
echo date_i18n('F d, Y H:i', 1365194723);
Это устанавливает дату PHP по умолчанию для параметра WP timezone_string, если он доступен, на время выполнения скрипта.
date_i18n($format, $timestamp)
форматы в соответствии с локалью, но не с часовым поясом. get_date_from_gmt($datestring, $format)
форматирует в соответствии с часовым поясом, но не с языковым стандартом. Чтобы получить форматирование в соответствии с часовым поясом и локали, я делаю следующее:
function local_date_i18n($format, $timestamp) {
$timezone_str = get_option('timezone_string') ?: 'UTC';
$timezone = new \DateTimeZone($timezone_str);
// The date in the local timezone.
$date = new \DateTime(null, $timezone);
$date->setTimestamp($timestamp);
$date_str = $date->format('Y-m-d H:i:s');
// Pretend the local date is UTC to get the timestamp
// to pass to date_i18n().
$utc_timezone = new \DateTimeZone('UTC');
$utc_date = new \DateTime($date_str, $utc_timezone);
$timestamp = $utc_date->getTimestamp();
return date_i18n($format, $timestamp, true);
}
Пример программы:
$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;
Выходные данные для часового пояса Лос-Анджелеса:
По местному времени: 05 апреля 2013 11:36 UTC: Апрель 05, 2013 18:36
Ссылки:
-
DateTimeZone
документы в php.net -
DateTime
документы в php.net, в том числеsetTimestamp
,getTimestamp
иformat
- WordPress'
date_i18n
документы
Преобразование UTC в строку в часовом поясе, языке и формате в настройках WordPress
Я создал хорошо документированную функцию, которая преобразует строку даты и времени в UTC в красивую строку даты и времени на правильном языке, формате и часовом поясе. Не стесняйтесь копировать его.
Например, передача "2019-05-30 18:06:01"
(в UTC) вернет "Maggio 30, 2019 10:06 am"
.
/**
* Given a string with the date and time in UTC, returns a pretty string in the
* configured language, format and timezone in WordPress' options.
*
* @param string $utc_date_and_time
* e.g: "2019-05-30 18:06:01"
* This argument must be in UTC.
* @return string
* e.g: "Maggio 30, 2019 10:06 am"
* This returns a pretty datetime string in the correct language and
* following the admin's settings.
*/
function pretty_utc_date( string $utc_date ): string {
if (! preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $utc_date ) ) {
/* I have not tested other formats, so only this one allowed. */
throw new InvalidArgumentException( "Expected argument to be in YYYY-MM-DD hh:mm:ss format" );
}
$date_in_local_timezone = get_date_from_gmt( $utc_date );
/* $date_in_local_timezone is now something like "2019-05-30 10:06:01"
* in the timezone of get_option( 'timezone_string' ), configured in
* WordPress' general settings in the backend user interface.
*/
/* Unfortunately, we can't just pass this to WordPress' date_i18n, as that
* expects the second argument to be the number of seconds since 1/Jan/1970
* 00:00:00 in the timezone of get_option( 'timezone_string' ), which is not the
* same as a UNIX epoch timestamp, which is the number of seconds since
* 1/Jan/1970 00:00:00 GMT. */
$seconds_since_local_1_jan_1970 =
(new DateTime( $date_in_local_timezone, new DateTimeZone( 'UTC' ) ))
->getTimestamp();
// e.g: 1559210761
/* Administrators can set a preferred date format and a preferred time
* format in WordPress' general settings in the backend user interface, we
* need to retrieve that. */
$settings_format = get_option( 'date_format' ) . ' '. get_option( 'time_format' );
// $settings_format is in this example "F j, Y g:i a"
/* In this example, the installation of WordPress has been set to Italian,
* and the final result is "Maggio 30, 2019 10:06 am" */
return date_i18n( $settings_format, $seconds_since_local_1_jan_1970 );
}
Ссылки:
- WordPress'
get_date_from_gmt
документы -
DateTimeZone
документы в php.net -
DateTime
документы в php.net, в том числеgetTimestamp
- WordPress'
date_i18n
документы - Стоит помнить, что WordPress работает
date_default_timezone_set( 'UTC' );
независимо от того, какой часовой пояс администратор выбрал в пользовательском интерфейсе, поэтому имейте это в виду при определении поведения встроенных функций PHP. Видишьdate_default_timezone_set
документы в php.net .
Добавьте смещение часового пояса к вашей метке времени.
$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );
Или лучше;
$tz = new DateTimeZone( get_option( 'timezone_string' ) );
$offset_for_that_time = timezone_offset_get ( $tz , new DateTime("@{$ts}") );
return date_i18n ( get_option( 'date_format' ), $ts + offset_for_that_time );
Это то, что, кажется, работает на моей машине (ничего из других вещей не работало):
$tz = new DateTimeZone(get_option('timezone_string'));
$dtz = new DateTimeZone('GMT');
foreach($posts as $key => $post){
$gmt_date = DateTime::createFromFormat('Y-m-d H:i:s', $post->PostDateGMT, $dtz);
$gmt_date->setTimeZone($tz);
$posts[$key]->PostDateGMT = $gmt_date->format('Y-m-d H:i:s');
}
Исходный код: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/
Он не использует date_l18n()
, но я думаю, что его можно было бы использовать позже...