Convertire i timestamp in ora locale con date_l18n()
Ho un cron job WordPress che invia una email periodicamente e salva il timestamp dell'invio come opzione, e vorrei visualizzare una data nella pagina delle impostazioni. Qualcosa del tipo "L'ultima email è stata inviata il 'x'". Mi trovo sulla costa occidentale degli Stati Uniti, quindi il nostro fuso orario è attualmente sette ore indietro rispetto all'UTC.
L'output che mi aspetterei da date_i18n(), passandogli il timestamp, sarebbe una data formattata localmente con un aggiustamento di sette ore rispetto all'UTC. Tuttavia, restituisce l'ora in UTC. Anche provando a ottenere l'ora corrente non restituisce quello che pensavo sarebbe stato l'output previsto.
Per esempio: echo date_i18n('F d, Y H:i');
restituisce April 05, 2013 11:36 come previsto, ma echo date_i18n('F d, Y H:i',time());
restituisce April 05, 2013 18:36.
È intenzionale questo comportamento? Come posso ottenere una data formattata localmente da un timestamp preesistente? Grazie per qualsiasi aiuto.
So che sono in ritardo di tre mesi, ma la funzione che stai cercando qui è get_date_from_gmt()
di WordPress.
La funzione accetta come primo parametro una data GMT/UTC nel formato Y-m-d H:i:s
e come secondo parametro il formato della data desiderato. Convertirà la data nel fuso orario locale impostato nella schermata delle Impostazioni.
Esempio di utilizzo:
echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );

Grazie mille, ho visto questa notifica apparire proprio ora. L'ho cambiata con la risposta corretta.

Ho aggiunto la configurazione di data e ora:
echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );

@NabilKadimi è un'ottima aggiunta, ma ancora non traduce la stringa nella lingua corretta. Vedi la mia risposta per una funzione che tiene conto di tutti e tre gli elementi configurati: lingua, fuso orario e formato della data.

Dal codex:
current_time('timestamp') dovrebbe essere usato al posto di time() per restituire l'ora locale del blog. In WordPress, il time() di PHP restituirà sempre UTC ed è lo stesso che chiamare current_time('timestamp', true).
Prova questo:
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);
Questo imposta la data predefinita di PHP all'opzione timezone_string di WP, se disponibile, per la durata dello script.

Giusto, ma cosa succede se ho un timestamp arbitrario? Diciamo di un paio di giorni fa, come ottengo l'ora regolata invece dell'ora UTC?

No, ho persino provato su un'installazione pulita di WP con solo il tema 2012 eseguendo questa istruzione echo date_i18n('F d, Y H:i',1365194723)
all'inizio di index.php, ma mi restituisce l'ora UTC invece dell'ora della West Coast americana.

Hai ragione, sembra che date_i18n sia principalmente per la formattazione locale delle date, piuttosto che per la regolazione delle date. Ho aggiornato la mia risposta.

Sì, speravo di evitare di dover impostare manualmente il fuso orario, ma se è l'unico modo, va bene così. Contrassegnato come risolto, grazie per l'aiuto.

WordPress chiama date_default_timezone_set( 'UTC' );
, sembra una cattiva idea sovrascriverlo chiamando date_default_timezone_set
da soli, poiché il codice di WordPress e i plugin potrebbero fare affidamento su questo comportamento.

date_i18n($format, $timestamp)
formatta secondo le impostazioni locali, ma non considera il fuso orario. get_date_from_gmt($datestring, $format)
formatta secondo il fuso orario, ma non considera le impostazioni locali. Per ottenere una formattazione che tenga conto sia del fuso orario che delle impostazioni locali, sto utilizzando il seguente codice:
function local_date_i18n($format, $timestamp) {
$timezone_str = get_option('timezone_string') ?: 'UTC';
$timezone = new \DateTimeZone($timezone_str);
// La data nel fuso orario locale.
$date = new \DateTime(null, $timezone);
$date->setTimestamp($timestamp);
$date_str = $date->format('Y-m-d H:i:s');
// Simula che la data locale sia UTC per ottenere il timestamp
// da passare a 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);
}
Esempio di programma:
$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Locale: ", $local, " UTC: ", $gmt;
Output per il fuso orario di Los Angeles:
Locale: April 05, 2013 11:36 UTC: April 05, 2013 18:36
Riferimenti:
- Documentazione di
DateTimeZone
su php.net - Documentazione di
DateTime
su php.net, inclusisetTimestamp
,getTimestamp
eformat
- Documentazione di WordPress per
date_i18n

Conversione da UTC a stringa nel fuso orario, lingua e formato delle opzioni di WordPress
Ho creato una funzione ben documentata che converte una stringa di data-ora in UTC in una stringa di data-ora formattata nella lingua, formato e fuso orario corretti. Sentiti libero di copiarla.
Ad esempio, passando "2019-05-30 18:06:01"
(in UTC) restituirà "30 Maggio 2019 10:06 am"
.
/**
* Data una stringa con data e ora in UTC, restituisce una stringa formattata
* nella lingua, formato e fuso orario configurati nelle opzioni di WordPress.
*
* @param string $utc_date_and_time
* es: "2019-05-30 18:06:01"
* Questo argomento deve essere in UTC.
* @return string
* es: "30 Maggio 2019 10:06 am"
* Restituisce una stringa di data-ora formattata nella lingua corretta e
* seguendo le impostazioni dell'amministratore.
*/
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 ) ) {
/* Non ho testato altri formati, quindi permetto solo questo. */
throw new InvalidArgumentException( "L'argomento deve essere nel formato YYYY-MM-DD hh:mm:ss" );
}
$date_in_local_timezone = get_date_from_gmt( $utc_date );
/* $date_in_local_timezone ora sarà qualcosa come "2019-05-30 10:06:01"
* nel fuso orario di get_option( 'timezone_string' ), configurato nelle
* impostazioni generali di WordPress nell'interfaccia utente di backend.
*/
/* Sfortunatamente, non possiamo passare direttamente questo a date_i18n di WordPress,
* poiché si aspetta che il secondo argomento sia il numero di secondi dal 1/Gen/1970
* 00:00:00 nel fuso orario di get_option( 'timezone_string' ), che non è lo stesso
* di un timestamp UNIX epoch, che è il numero di secondi dal
* 1/Gen/1970 00:00:00 GMT. */
$seconds_since_local_1_jan_1970 =
(new DateTime( $date_in_local_timezone, new DateTimeZone( 'UTC' ) ))
->getTimestamp();
// es: 1559210761
/* Gli amministratori possono impostare un formato di data e un formato di ora preferiti
* nelle impostazioni generali di WordPress nell'interfaccia utente di backend,
* dobbiamo recuperarli. */
$settings_format = get_option( 'date_format' ) . ' '. get_option( 'time_format' );
// $settings_format in questo esempio è "j F Y g:i a"
/* In questo esempio, l'installazione di WordPress è stata impostata in italiano,
* e il risultato finale è "30 Maggio 2019 10:06 am" */
return date_i18n( $settings_format, $seconds_since_local_1_jan_1970 );
}
Riferimenti:
- Documentazione di WordPress per
get_date_from_gmt
- Documentazione di
DateTimeZone
su php.net - Documentazione di
DateTime
su php.net, inclusagetTimestamp
- Documentazione di WordPress per
date_i18n
- Vale la pena ricordare che WordPress esegue
date_default_timezone_set( 'UTC' );
indipendentemente dal fuso orario selezionato dall'amministratore nell'interfaccia utente, quindi tienilo a mente quando determini il comportamento delle funzioni PHP integrate. Vedi la documentazione didate_default_timezone_set
su php.net.

I timestamp non hanno un fuso orario, quindi quasi mai è necessario manipolarli matematicamente.
A partire da WordPress v5.3, la soluzione più semplice per timestamp specifici è wp_date()
:
$format = get_option( 'time_format' ) . ', ' . get_option( 'date_format' );
echo wp_date( $format, $your_timestamp );
Per la data e ora corrente, usa l'appropriatamente chiamato current_datetime
:
echo current_datetime()->format( $format );

I timestamp sono il numero di secondi trascorsi dal 1 gennaio 1970 00:00 UTC per alcune definizioni di timestamp, o il numero di secondi trascorsi dal 1 gennaio 1970 nel fuso orario locale per altre definizioni di timestamp.

@Flimm In PHP (e quindi in WordPress), i timestamp sono sempre in GMT. Vedi time()
.

Aggiungi l'offset del fuso orario al tuo timestamp.
$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );
oppure meglio;
$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 );

Questo è ciò che sembra funzionare sulla mia macchina (nessuna delle altre soluzioni ha funzionato):
$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');
}
Codice originale: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/
Non utilizza date_l18n()
ma immagino che si potrebbe usarlo successivamente...

get_the_time
accetta un argomento $post
dal 2008 circa.
