Risposte:
se hai bisogno di gmt_offset allora
<?php echo get_option('gmt_offset'); ?>
questo ti darà un numero intero come 2 o -2 .
e se hai bisogno della stringa del fuso orario usa
<?php echo get_option('timezone_string'); ?>
questo ti darà una stringa come l' America / Indianapolis
La spiacevole situazione è che ci sono davvero due diverse opzioni:
timezone_string
, che consente di salvare il fuso orario in stile PHP.gmt_offset
, che salva l'offset numerico del float in ore.Ma in ambienti più recenti timezone_string
in realtà le sostituzioni gmt_offset
, il valore restituito da quest'ultimo sarà basato sul precedente. Tuttavia, non è vero il contrario : gmt_offset
potrebbe essere valido, mentre timezone_string
è vuoto.
Ho trascorso un bel po 'di tempo su queste cose e il take più attuale che ho implementato nella mia WpDateTime
libreria è il seguente:
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 );
}
}
Ciò tenterà di creare un'istanza di un oggetto fuso orario significativo in tutti i casi possibili, a condizione che siano disponibili tutte le informazioni.
(int)
per $ ore e floor
per $ minuti è problematico? Secondo la documentazione, (int)
e floor
sono quasi gli stessi tranne (int)
che per arrotondare da -4,5 a -4 e floor
per arrotondare a -5. Questo sembra che darà offset del fuso orario negativo errati?
Controlla la pagina di riferimento delle opzioni . L'opzione gmt_offset
restituisce un numero intero. Ad esempio, se il fuso orario è impostato sull'ora orientale (ad es. America / New_York), gmt_offset
dovrebbe essere -5.
Non pensare che otterrai una stringa come US / Eastern senza memorizzare tutte le stringhe che desideri in un array e riferirti ad esse. Utilizzando PHP è possibile ottenere l'abbreviazione del fuso orario, ovvero EST ; e se hai quei valori memorizzati in un array con le stringhe che desideri, puoi cercarli.
<?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.
?>
Da aggiungere a Bainternet (lo sto aggiungendo come risposta perché non posso commentare - ho meno di 50 punti nello stack di sviluppo WP).
WordPress memorizzerà una stringa di fuso orario solo se selezioni una stringa di fuso orario nelle impostazioni generali. La selezione UTF è la posizione predefinita nell'elenco, ma è possibile scorrere fino alle stringhe del fuso orario. Se si imposta una stringa del fuso orario, verranno impostate sia la stringa UTF che la stringa del fuso orario. Saranno gli stessi (ovvero, l'UTF viene reimpostato sulla nuova zona quando si seleziona un fuso orario stringa di fuso orario).
(WordPress 4)
Ci sono alcune opzioni, nessuna delle quali funziona davvero alla grande. Questo è un bug di WordPress e fa davvero schifo perché il tempo è sbagliato a meno che tu non imposti il tuo sito su UTC ... il che è confuso e non sempre nemmeno possibile.
Questo prossimo codice penso che funzioni solo se scegli il tuo fuso orario (in Impostazioni -> Generale in admin) come una città con nome invece di un offset del numero GMT. Non l'ho provato ma è possibile che get_option('gmt_offset')
sia impostato quando get_option('timezone_string')
non lo è.
date_default_timezone_set(get_option('timezone_string'));
Il rovescio della medaglia di questo è che WordPress presuppone che PHP sia impostato su UTC quando si creano timestamp mysql, quindi puoi rovinare un po 'il tuo database ogni volta che cambi fuso orario! Per non parlare degli altri plugin WP, si può presumere che l'ambiente PHP sia sempre in UTC.
Quindi, se desideri solo un orario corretto, puoi forzare il timestamp in UTC con:
get_post_time('c', true); //should work for non-post objects.
Sfortunatamente, anche se corretto, il fuso orario verrà impostato su UTC.
E nota che non puoi usare sia il flag "true" che la funzione timezone_set predefinita.
Qualsiasi soluzione appropriata sarà uno snippet di codice che tiene conto di entrambi gmt_offset
AND timezone_string
e li utilizza per impostare un fuso orario su alcuni input. WP presuppone che PHP sia impostato su UTC durante l'esecuzione di timestamp mysql e che potrebbe interrompere altri plugin.
C'è una soluzione del genere su https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ ma, di nuovo, questo è un BUG, quindi dovresti usare il get_post_time($date_format, TRUE)
codice per ottenere un timestamp che è in realtà corretto.
Dato che wordpress mantiene la stringa del fuso orario nella tabella delle opzioni, puoi usare il modo orientato agli oggetti per ottenere il momento giusto sul tuo sito 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>";