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

50

¿Alguien puede decirme cómo obtener la zona horaria establecida en el Administrador de WordPress?

Por ejemplo, si el blog está configurado a la hora del Este, necesito esta cadena exacta para imprimir:

EE. UU. / Este

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

usuario1462
fuente

Respuestas:

79

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 necesita la cadena de zona horaria use

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

esto te dará una cuerda como América / Indianápolis

Bainternet
fuente
66
Mi timezone_string está en la base de datos pero está vacía, 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)
usuario2019515
¿Gmt_offest tiene en cuenta el horario de verano en función de la configuración de zona horaria del sitio?
squarecandy
66
@ user2019515 Si elige una ciudad como zona horaria, se guardará en la opción "timezone_string", pero si elige una compensación manual (UTC + 1, por ejemplo), se guardará en la opción "gmt_offset" (como "1") y timezone_string permanece vacío
Berend
15

La situación desafortunada es que, de hecho, hay dos opciones diferentes:

  1. Más nuevo timezone_string, que guarda la zona horaria de estilo PHP.
  2. Más antiguo gmt_offset, lo que ahorra el desplazamiento numérico flotante en horas.

Pero en los entornos más nuevos, en timezone_stringrealidad , se anula gmt_offset , el valor devuelto por este último se basará en el primero. Sin embargo, lo contrario no es cierto: gmt_offsetpuede ser válido mientras timezone_stringesté vacío.

He dedicado bastante tiempo a estas cosas, y la versión más actual que implementé en mi WpDateTimebiblioteca es la siguiente:

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determine time zone from WordPress options and return as object.
     *
     * @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 );
    }
}

Esto intentará crear una instancia de un objeto de zona horaria significativo en todos los casos posibles, siempre que haya alguna información disponible.

Rarst
fuente
1
Esta debería ser la respuesta aceptada. Las personas se encontrarán con errores si se basan únicamente en get_option ('timezone_string').
DiscoInfiltrator
Esta es la respuesta correcta.
Lucas Bustamante
¿No es problemático el uso de (int)$ horas y floor$ minutos? De acuerdo con la documentación, (int)y floorson casi lo mismo, excepto (int)que redondeará -4.5 a -4 y floorlo redondeará a -5. Esto parece que dará compensaciones de zona horaria negativas incorrectas.
Mikepote
1
@Mikepote, sí, esto se solucionó en la biblioteca hace mucho tiempo, solo una copia obsoleta del código en la respuesta aquí.
Rarst
Dios mío, ¿por qué lo implementaron así? ... Me costó una inclinación de
Blackbam
9

Consulte la página de referencia de opciones . La opción gmt_offsetdevuelve un entero. Por ejemplo, si la zona horaria está configurada para la hora del Este (por ejemplo, América / Nueva York), gmt_offsetdebería ser -5.

Travis Northcutt
fuente
2

No piense que obtendrá una cadena como US / Eastern sin almacenar todas las cadenas que desee en una matriz y hacer referencia a ellas. Usando PHP puede obtener la abreviatura de zona horaria, es decir EST ; y si tiene esos valores almacenados en una matriz con las cadenas que desea, puede buscarlos.

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

      echo date('T'); // will give you three-character string like "EST"

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

      echo $timezones [ date('T') ]; // should be what you want.
 ?>
goldenapples
fuente
Esto es innecesario Los estándares de zona horaria han sido parte de PHP desde 5.2, al igual que el objeto DateTimeZone y las funciones estándar relacionadas.
haz
1

Para agregar a Bainternet (estoy agregando esto como respuesta porque no puedo comentar, tengo menos de 50 puntos en la pila de desarrollo de WP).

WordPress solo almacenará una cadena de zona horaria si selecciona una cadena de zona horaria en la configuración general. La selección de UTF es donde está predeterminada en la lista, pero puede desplazarse hasta las cadenas de zona horaria. Si configura una cadena de zona horaria, se establecerán tanto la cadena UTF como la cadena de zona horaria. Serán lo mismo (es decir, el UTF se restablece a la nueva zona cuando selecciona una zona horaria de cadena de zona horaria).

(WordPress 4)

Jeff
fuente
0

Hay algunas opciones, ninguna de las cuales realmente funciona muy bien. Este es un error de WordPress, y realmente apesta porque el tiempo es incorrecto a menos que configure su sitio en UTC ... lo cual es confuso y no siempre es posible.

Creo que el siguiente código solo funciona si eliges tu zona horaria (en Configuración -> General en admin) como una ciudad con nombre en lugar de un desplazamiento de número GMT. No he probado esto, 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'));

La desventaja de esto es que WordPress asume que PHP está configurado en UTC al hacer marcas de tiempo mysql, por lo que puede dañar su base de datos un poco cada vez que cambie de zona horaria. Sin mencionar que otros complementos de WP pueden suponer que el entorno PHP siempre está en UTC.

Entonces, si solo desea una hora correcta, puede forzar su marca de tiempo para que esté en UTC con:

get_post_time('c', true); //should work for non-post objects.

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

Y tenga en cuenta que no se puede tanto utilizar el "verdadero" de la bandera y la función timezone_set defecto.

Cualquier solución adecuada será un fragmento de código que tenga en cuenta ambos gmt_offsetAND timezone_stringy los use para establecer una zona horaria en alguna entrada. WP supone que PHP se configuró en UTC al hacer marcas de tiempo mysql, y podría romper otros complementos.

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

Ryan Taylor
fuente
0

Dado el hecho de que WordPress mantiene la cadena de zona horaria en la tabla de opciones, puede utilizar la forma orientada a objetos para obtener el momento adecuado en su sitio de WordPress:

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

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Pål Bergquist
fuente