¿Cómo obtener la configuración de zona horaria en WordPress?

3 feb 2011, 00:38:06
Vistas: 88.9K
Votos: 65

¿Alguien puede decirme cómo obtener la zona horaria que está configurada en el Administrador de WordPress?

Por ejemplo, si el blog está configurado en hora del Este, necesito que se muestre exactamente esta cadena:

US/Eastern

Esto es para una función que vive en functions.php en mi tema.

0
Todas las respuestas a la pregunta 8
3
96

si necesitas el gmt_offset entonces

<?php echo get_option('gmt_offset'); ?>

esto te dará un número entero como 2 o -2.

y si necesitas la cadena de zona horaria usa

<?php echo get_option('timezone_string'); ?>

esto te dará una cadena como America/Indianapolis

3 feb 2011 01:42:35
Comentarios

Mi timezone_string está en la base de datos pero está vacío, incluso después de seleccionar una zona horaria diferente en la página de configuración. ¿Cuál podría ser el caso? (WP3.6)

user2019515 user2019515
14 sept 2013 01:48:34

¿El gmt_offset tiene en cuenta el horario de verano basado en la configuración de zona horaria del sitio?

squarecandy squarecandy
19 dic 2013 06:04:38

@user2019515 Si eliges una ciudad como zona horaria, se guardará en la opción "timezone_string", pero si eliges un Desplazamiento Manual (UTC+1 por ejemplo), se guarda en la opción "gmt_offset" (como "1") y timezone_string permanece vacío.

Berend Berend
27 mar 2017 21:06:51
7
26

La situación desafortunada es que en realidad existen dos opciones diferentes:

  1. El más reciente timezone_string, que guarda la zona horaria en formato PHP.
  2. El más antiguo gmt_offset, que guarda un desplazamiento numérico en horas (float).

Pero en entornos más nuevos, timezone_string en realidad anula a gmt_offset, y el valor devuelto por este último se basará en el primero. Sin embargo, lo contrario no es cierto: gmt_offset podría ser válido mientras que timezone_string esté vacío.

WordPress 5.3 incluyó la función wp_timezone(), que abstrae esto y devuelve un objeto DateTimeZone válido, independientemente de la configuración subyacente de WP.

Antes de eso, yo había implementado un enfoque en mi biblioteca WpDateTime (como dato curioso, esto sirvió como base para la implementación en el núcleo):

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determina la zona horaria a partir de las opciones de WordPress y la devuelve como objeto.
     *
     * @return static
     */
    public static function getWpTimezone() {
        $timezone_string = get_option( 'timezone_string' );
        if ( ! empty( $timezone_string ) ) {
            return new static( $timezone_string );
        }
        $offset  = get_option( 'gmt_offset' );
        $hours   = (int) $offset;
        $minutes = abs( ( $offset - (int) $offset ) * 60 );
        $offset  = sprintf( '%+03d:%02d', $hours, $minutes );
        return new static( $offset );
    }
}
16 oct 2017 17:33:17
Comentarios

Esta debería ser la respuesta aceptada. La gente encontrará errores si confían únicamente en get_option('timezone_string').

DiscoInfiltrator DiscoInfiltrator
14 ago 2018 23:25:59

Esta es la respuesta correcta.

Lucas Bustamante Lucas Bustamante
9 dic 2018 17:41:08

¿No es problemático el uso de (int) para $hours y floor para $minutes? Según la documentación, (int) y floor son casi iguales excepto que (int) redondeará -4.5 a -4 y floor lo redondeará a -5. ¿Esto no daría como resultado desplazamientos de zona horaria negativos incorrectos?

Mikepote Mikepote
13 may 2019 16:22:31

@Mikepote sí, esto se solucionó en la librería hace mucho tiempo, solo es una copia desactualizada del código en la respuesta aquí.

Rarst Rarst
15 may 2019 13:54:47

Dios mío, ¿por qué lo implementaron así...? Me costó una hora entera de frustración

Blackbam Blackbam
21 jun 2019 18:29:11

¿La librería maneja el hecho de que una zona horaria puede contener múltiples desplazamientos? Ver: https://stackoverflow.com/tags/timezone/info

DarkNeuron DarkNeuron
27 nov 2019 13:49:34

@DarkNeuron la biblioteca simplemente deja eso a PHP, que incluye y utiliza la base de datos olson.

Rarst Rarst
29 nov 2019 14:10:49
Mostrar los 2 comentarios restantes
0

Consulta la página de referencia de opciones. La opción gmt_offset devuelve un número entero. Por ejemplo, si la zona horaria está configurada en hora del Este (por ejemplo, America/New_York), gmt_offset debería ser -5.

3 feb 2011 00:44:06
0

Dado que WordPress guarda la cadena de zona horaria en la tabla de opciones, puedes usar el enfoque orientado a objetos para obtener la hora correcta en tu sitio de WordPress:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> Fecha y Hora " . $dt->format("Y-m-d H:i:s") . "</p>";
5 ago 2019 23:01:56
1

No creas que vas a obtener una cadena como US/Eastern sin almacenar todas las cadenas que necesitas en un array y referenciarlas. Usando PHP puedes obtener la abreviatura de la zona horaria, es decir EST; y si tienes esos valores almacenados en un array con las cadenas que deseas, puedes buscarlas.

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // te dará una cadena de tres caracteres como "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // debería ser lo que buscas.
 ?>
3 feb 2011 07:42:20
Comentarios

Esto es innecesario. Los estándares de zona horaria han sido parte de PHP desde la versión 5.2, al igual que el objeto DateTimeZone y las funciones estándar relacionadas.

haz haz
24 oct 2018 06:18:01
0

Para agregar a Bainternet (estoy publicando esto como respuesta porque no puedo comentar - tengo menos de 50 puntos en el stack de Desarrollo de WP).

WordPress solo almacenará una cadena de zona horaria si seleccionas una cadena de zona horaria en los ajustes generales. La selección UTC es donde aparece por defecto en la lista, pero puedes desplazarte hacia arriba para ver las cadenas de zona horaria. Si configuras una cadena de zona horaria, tanto el UTC como la cadena de zona horaria se establecerán. Serán lo mismo (es decir, el UTC se restablece a la nueva zona cuando seleccionas una zona horaria basada en cadena).

(WordPress 4)

11 dic 2014 08:11:00
0

Como mencionó Rarst, ahora puedes usar wp_timezone() que devuelve un objeto de zona horaria.

O para obtener la zona horaria como una cadena, wp_timezone_string(), que devuelve 'Europe/Rome', 'UTC', o el desplazamiento UTC como '-6:00'.

Y si deseas la abreviatura, wp_date('T') también devuelve la zona horaria localizada.

4 jun 2021 18:15:29
0

Hay algunas opciones, ninguna de las cuales funciona realmente bien. Este es un error de WordPress, y realmente es molesto porque la hora es incorrecta a menos que configures tu sitio en UTC... lo cual es confuso y no siempre es posible.

El siguiente código creo que solo funciona si eliges tu zona horaria (en Ajustes -> General en el administrador) como una ciudad con nombre en lugar de un desplazamiento numérico GMT. No lo he probado, pero es muy posible que get_option('gmt_offset') esté configurado cuando get_option('timezone_string') no lo esté.

date_default_timezone_set(get_option('timezone_string'));

El inconveniente de esto es que WordPress asume que PHP está configurado en UTC al crear marcas de tiempo de MySQL, por lo que puedes desordenar un poco tu base de datos cada vez que cambias de zona horaria. Sin mencionar que otros plugins de WP pueden asumir que el entorno de PHP siempre está en UTC.

Entonces, si solo quieres una hora correcta, puedes forzar tu marca de tiempo a UTC con:

get_post_time('c', true); // debería funcionar para objetos que no son posts.

Desafortunadamente, aunque es correcto, hará que la zona horaria se establezca en UTC.

Y ten en cuenta que no puedes tanto usar el flag "true" como la función timezone_set por defecto.

Cualquier solución adecuada será un fragmento de código que tenga en cuenta tanto gmt_offset como timezone_string y los use para establecer una zona horaria en alguna entrada. WP asume que PHP está configurado en UTC al hacer marcas de tiempo de MySQL, y podría romper otros plugins.

Hay una solución de este tipo en https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ pero, de nuevo, esto es un ERROR, por lo que deberías usar el código get_post_time($date_format, TRUE) para obtener una marca de tiempo que sea realmente correcta.

6 nov 2015 02:35:13