Conversione di timestamp in ora locale con date_l18n ()


15

Ho un lavoro cron di WordPress che invia periodicamente un'e-mail e salva il timestamp quando è stato inviato come opzione e vorrei visualizzare una data su una pagina delle impostazioni. Qualcosa come "L'ultima email è stata inviata su 'x'". Sono sulla costa occidentale degli Stati Uniti, quindi il nostro tempo è attualmente a sette ore al largo di UTC.

Il mio output atteso da date_i18n (), passandogli il timestamp, sarebbe una data formattata localmente con un aggiustamento di sette ore da UTC. Tuttavia, restituisce l'ora in UTC. Anche cercare di ottenere l'ora corrente non restituisce quello che penso sarebbe l'output previsto.

Ad esempio: echo date_i18n('F d, Y H:i');restituisce il 5 aprile 2013 11:36 come previsto, ma echo date_i18n('F d, Y H:i',time());restituisce il 05 aprile 2013 18:36.

È intenzionale? Come posso restituire una data formattata localmente da un timestamp preesistente? Grazie per qualsiasi aiuto.


Hai impostato il fuso orario in Impostazioni-> Generale?
vancoder,

Sì, a Los Angeles.
Andrew Bartel,

Risposte:


31

So che sono in ritardo di tre mesi, ma la funzione che vuoi qui è WordPress ' get_date_from_gmt().

La funzione accetta una data GMT / UTC in Y-m-d H:i:sformato come primo parametro e il formato data desiderato come secondo parametro. Converte la tua data nel fuso orario locale come impostato nella schermata 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' );


2
Killer grazie, ho visto questo popup nelle mie notifiche proprio ora. L'ho passato alla risposta corretta.
Andrew Bartel,

1
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,

@NabilKadimi è un'ottima aggiunta, ma non traduce ancora la stringa nella lingua corretta. Vedi la mia risposta per una funzione che tenga conto di tutte e tre le lingue configurate, il fuso orario e il formato della data.
Flimm,

5

Dal codice :

current_time ('timestamp') dovrebbe essere usato al posto di time () per restituire l'ora locale del blog. In WordPress, time () di PHP restituirà sempre UTC ed equivale a 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);

Ciò imposta la data PHP predefinita sull'opzione timezone_string di WP, se disponibile, per la durata dello script.


1
Giusto, ma cosa succede se ho un timestamp arbitrario? Di 'un paio di giorni fa, come posso ottenere l'ora regolata anziché l'ora UTC?
Andrew Bartel,

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

No, l'ho persino provato su un'installazione WP vanilla con il 2012 solo eseguendo questa echo date_i18n('F d, Y H:i',1365194723)affermazione nella parte superiore di index.php, che mi dà UTC piuttosto che il tempo della costa occidentale degli Stati Uniti.
Andrew Bartel,

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

Sì, speravo di evitare di dover impostare manualmente il fuso orario, ma se è l'unico modo, così sia. Contrassegnato come risposto, grazie per l'aiuto.
Andrew Bartel,

2

date_i18n($format, $timestamp)formati in base alla locale, ma non al fuso orario. get_date_from_gmt($datestring, $format)formati in base al fuso orario, ma non alla locale. Per ottenere la formattazione in base al fuso orario e alla locale, sto facendo quanto segue:

function local_date_i18n($format, $timestamp) {
    $timezone_str = get_option('timezone_string') ?: 'UTC';
    $timezone = new \DateTimeZone($timezone_str);

    // The date in the local timezone.
    $date = new \DateTime(null, $timezone);
    $date->setTimestamp($timestamp);
    $date_str = $date->format('Y-m-d H:i:s');

    // Pretend the local date is UTC to get the timestamp
    // to pass to 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 "Local: ", $local, " UTC: ", $gmt;

Uscita per il fuso orario di Los Angeles:

Locale: 05 aprile 2013 11:36 UTC: 05 aprile 2013 18:36

Riferimenti:


0

Aggiungi la differenza di fuso orario al tuo timestamp.

$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
return date_i18n( get_option( 'date_format' ), $ts + $offset );

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

0

Conversione di UTC in stringa in fuso orario, lingua e formato nelle opzioni di WordPress

Ho creato una funzione ben documentata che converte una stringa di data e ora in UTC in una stringa di data e ora nella lingua, nel formato e nel fuso orario corretti. Sentiti libero di copiarlo.

Ad esempio, il passaggio "2019-05-30 18:06:01"(in UTC) verrebbe restituito "Maggio 30, 2019 10:06 am".

/**
 * Given a string with the date and time in UTC, returns a pretty string in the
 * configured language, format and timezone in WordPress' options.
 *
 * @param string $utc_date_and_time 
 *      e.g: "2019-05-30 18:06:01"
 *      This argument must be in UTC.
 * @return string 
 *      e.g: "Maggio 30, 2019 10:06 am"
 *      This returns a pretty datetime string in the correct language and
 *      following the admin's settings.
 */
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 ) ) {
        /* I have not tested other formats, so only this one allowed. */
        throw new InvalidArgumentException( "Expected argument to be in YYYY-MM-DD hh:mm:ss format" );
    }

    $date_in_local_timezone = get_date_from_gmt( $utc_date );

    /* $date_in_local_timezone is now something like "2019-05-30 10:06:01"
     * in the timezone of get_option( 'timezone_string' ), configured in
     * WordPress' general settings in the backend user interface.
     */

    /* Unfortunately, we can't just pass this to WordPress' date_i18n, as that
     * expects the second argument to be the number of seconds since 1/Jan/1970
     * 00:00:00 in the timezone of get_option( 'timezone_string' ), which is not the
     * same as a UNIX epoch timestamp, which is the number of seconds since
     * 1/Jan/1970 00:00:00 GMT. */
    $seconds_since_local_1_jan_1970 =
        (new DateTime( $date_in_local_timezone, new DateTimeZone( 'UTC' ) ))
        ->getTimestamp();
    // e.g: 1559210761

    /* Administrators can set a preferred date format and a preferred time
     * format in WordPress' general settings in the backend user interface, we
     * need to retrieve that. */
    $settings_format = get_option( 'date_format' ) . ' '. get_option( 'time_format' );
    // $settings_format is in this example "F j, Y g:i a"

    /* In this example, the installation of WordPress has been set to Italian,
     * and the final result is "Maggio 30, 2019 10:06 am" */
    return date_i18n( $settings_format, $seconds_since_local_1_jan_1970 );

}

Riferimenti:


-1

Questo è ciò che sembra funzionare sulla mia macchina (nessuna delle altre cose 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 sta usando date_l18n()ma immagino che uno potrebbe usarlo in seguito ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.