Convertire i timestamp in ora locale con date_l18n()

5 apr 2013, 21:48:15
Visualizzazioni: 40.7K
Voti: 19

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.

2
Commenti

Hai impostato il tuo fuso orario in Impostazioni->Generale?

vancoder vancoder
5 apr 2013 22:16:15

Sì, su Los Angeles.

Andrew Bartel Andrew Bartel
5 apr 2013 22:51:14
Tutte le risposte alla domanda 7
3
36

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

20 lug 2013 17:37:46
Commenti

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

Andrew Bartel Andrew Bartel
22 lug 2013 21:45:11

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

Nabil Kadimi Nabil Kadimi
22 lug 2014 02:31:05

@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.

Flimm Flimm
30 mag 2019 21:13:34
7

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.

5 apr 2013 22:18:12
Commenti

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?

Andrew Bartel Andrew Bartel
5 apr 2013 22:49:06

la funzione date_i18n('F d, Y H:i', $your_timestamp) non funziona?

vancoder vancoder
5 apr 2013 23:41:18

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.

Andrew Bartel Andrew Bartel
5 apr 2013 23:47:57

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.

vancoder vancoder
6 apr 2013 00:01:10

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.

Andrew Bartel Andrew Bartel
6 apr 2013 00:21:52

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.

Flimm Flimm
30 mag 2019 19:39:29

@Flimm ha ragione, qui, MAI cambiare l'impostazione del fuso orario predefinito.

Walf Walf
30 giu 2022 10:10:13
Mostra i restanti 2 commenti
0

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:

18 feb 2014 17:34:39
0

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, inclusa getTimestamp
  • 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 di date_default_timezone_set su php.net.
30 mag 2019 21:12:41
3

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 );
30 giu 2022 10:54:43
Commenti

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 Flimm
30 giu 2022 13:14:29

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

Walf Walf
1 lug 2022 07:39:00

Questa è la risposta corretta al 2024.

Ciantic Ciantic
7 mar 2024 17:01:20
0

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 );
16 feb 2015 04:24:48
1

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...

28 dic 2015 20:33:52
Commenti

get_the_time accetta un argomento $post dal 2008 circa.

Walf Walf
30 giu 2022 11:05:56