Convertir las marcas de tiempo a la hora local con date_l18n ()

12

Tengo un trabajo cron de WordPress que envía un correo electrónico periódicamente y guarda la marca de tiempo cuando se envió como una opción, y me gustaría mostrar una fecha en una página de configuración. Algo así como "El último correo electrónico fue enviado en 'x'". Estoy en la costa oeste de los EE. UU., Por lo que actualmente estamos a siete horas de UTC.

Mi salida esperada de date_i18n (), pasándole la marca de hora, sería una fecha con formato local con un ajuste de siete horas desde UTC. Sin embargo, devuelve el tiempo en UTC. Incluso intentar obtener la hora actual no devuelve lo que yo pensaría que sería el resultado esperado.

Por ejemplo: echo date_i18n('F d, Y H:i'); salidas el 5 de abril de 2013 11:36 como se esperaba, pero echo date_i18n('F d, Y H:i',time()); salidas el 5 de abril de 2013 18:36.

¿Esto es intencional? ¿Cómo puedo devolver una fecha formateada localmente desde una marca de tiempo preexistente? Gracias por cualquier ayuda.

    
pregunta Andrew Bartel 05.04.2013 - 20:48

5 respuestas

27

Sé que tengo tres meses de retraso, pero la función que desea aquí es get_date_from_gmt() .

La función acepta una fecha GMT / UTC en formato Y-m-d H:i:s como primer parámetro, y su formato de fecha deseado como segundo parámetro. Convierte tu fecha a la zona horaria local según lo establecido en la pantalla de Configuración.

Ejemplo de uso:

echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );

    
respondido por el John Blackbourn 20.07.2013 - 16:37
4

Desde el códice :

  

current_time ('timestamp') debe usarse en lugar de time () para regresar   La hora local del blog. En WordPress, el tiempo de PHP () siempre regresará   UTC y es lo mismo que llamar a current_time ('timestamp', true).

Prueba esto:

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

Esto establece la fecha predeterminada de PHP en la opción timezone_string de WP, si está disponible, durante la duración del script.

    
respondido por el vancoder 05.04.2013 - 21:18
1

date_i18n($format, $timestamp) formatos de acuerdo con la configuración regional, pero no la zona horaria. get_date_from_gmt($datestring, $format) se formatea de acuerdo con la zona horaria, pero no con la configuración regional. Para obtener el formato de acuerdo con la zona horaria y de la configuración regional, estoy haciendo lo siguiente:

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

Programa de ejemplo:

$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;

Salida para la zona horaria de Los Ángeles:

  

Local: 05 de abril de 2013 11:36 UTC: 05 de abril de 2013 18:36

    
respondido por el antonakos 18.02.2014 - 16:34
1

Agregue un desplazamiento de zona horaria a su marca de tiempo.

$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );

o mejor;

$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 );
    
respondido por el ecabuk 16.02.2015 - 03:24
0

Esto es lo que parece funcionar en mi máquina (ninguna de las otras cosas funcionó):

$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');
}

Código original: enlace

No está usando date_l18n() pero supongo que uno podría usarlo más adelante ...

    
respondido por el NoOne 28.12.2015 - 19:33

Lea otras preguntas en las etiquetas