Conversion d'horodatages en heure locale avec date_l18n ()


15

J'ai un travail cron WordPress qui envoie un e-mail périodiquement et enregistre l'horodatage lorsqu'il a été envoyé en option, et je voudrais afficher une date sur une page de paramètres. Quelque chose comme, "Le dernier e-mail a été envoyé le 'x'". Je suis sur la côte ouest des États-Unis, donc notre temps est actuellement de sept heures hors UTC.

Ma sortie attendue de date_i18n (), en lui passant l'horodatage, serait une date formatée localement avec un ajustement de sept heures à partir d'UTC. Cependant, il renvoie l'heure en UTC. Même essayer d'obtenir l'heure actuelle ne renvoie pas ce que je pense être la sortie attendue.

Par exemple: echo date_i18n('F d, Y H:i');sorties 05 avril 2013 11:36 comme prévu, mais echo date_i18n('F d, Y H:i',time());sorties 05 avril 2013 18:36.

Est-ce intentionnel? Comment puis-je renvoyer une date formatée localement à partir d'un horodatage préexistant? Merci pour toute aide.


Avez-vous défini votre fuseau horaire dans Paramètres-> Général?
vancoder

Oui, à Los Angeles.
Andrew Bartel

Réponses:


31

Je sais que j'ai trois mois de retard, mais la fonction que vous voulez ici est WordPress ' get_date_from_gmt().

La fonction accepte une date GMT / UTC au Y-m-d H:i:sformat comme premier paramètre et le format de date souhaité comme deuxième paramètre. Il convertira votre date en fuseau horaire local comme défini sur l'écran Paramètres.

Exemple d'utilisation:

echo get_date_from_gmt( date( 'Y-m-d H:i:s', $my_unix_timestamp ), 'F j, Y H:i:s' );


2
Merci tueur, j'ai vu ce popup dans mes notifications tout à l'heure. Je l'ai changé pour la bonne réponse.
Andrew Bartel du

1
J'ai ajouté la configuration de la date et de l'heure: 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 c'est un excellent ajout, mais il ne traduit toujours pas la chaîne dans la langue correcte. Voir ma réponse pour une fonction qui prend en compte les trois langues configurées, le fuseau horaire et le format de date.
Flimm

5

Du codex :

current_time ('timestamp') doit être utilisé à la place de time () pour renvoyer l'heure locale du blog. Dans WordPress, le temps de PHP () retournera toujours UTC et équivaut à appeler current_time ('timestamp', true).

Essaye ça:

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

Cela définit la date PHP par défaut sur l'option timezone_string de WP, si disponible, pour la durée du script.


1
D'accord, mais si j'ai un horodatage arbitraire? Disons qu'il y a quelques jours, comment puis-je obtenir l'heure ajustée plutôt que l'heure UTC?
Andrew Bartel

ne date_i18n('F d, Y H:i', $your_timestamp)fonctionne pas?
vancoder

Non, même essayé sur une installation WP vanilla avec 2012 en exécutant simplement cette echo date_i18n('F d, Y H:i',1365194723)déclaration en haut de index.php, qui me donne l'heure UTC plutôt que l'heure de la côte ouest des États-Unis.
Andrew Bartel

Vous avez raison, il semble que date_i18n soit principalement pour le formatage local des dates, plutôt que pour l'ajustement de la date. J'ai mis à jour ma réponse.
vancoder

Oui, j'espérais éviter d'avoir à régler le fuseau horaire manuellement, mais si c'est le seul moyen, qu'il en soit ainsi. Marqué comme ayant répondu, merci pour l'aide.
Andrew Bartel

2

date_i18n($format, $timestamp)formats selon les paramètres régionaux, mais pas le fuseau horaire. get_date_from_gmt($datestring, $format)formats selon le fuseau horaire, mais pas les paramètres régionaux. Pour obtenir le formatage en fonction du fuseau horaire et des paramètres régionaux, je fais ce qui suit:

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

Exemple de programme:

$format = 'F d, Y H:i';
$timestamp = 1365186960;
$local = local_date_i18n($format, $timestamp);
$gmt = date_i18n($format, $timestamp);
echo "Local: ", $local, " UTC: ", $gmt;

Sortie pour le fuseau horaire de Los Angeles:

Local: 05 avril 2013 11:36 UTC: 05 avril 2013 18:36

Les références:


0

Ajoutez un décalage de fuseau horaire à votre horodatage.

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

ou mieux;

$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

Conversion UTC en chaîne dans le fuseau horaire, la langue et le format dans les options de WordPress

J'ai créé une fonction bien documentée qui convertit une chaîne date-heure en UTC en une jolie chaîne date-heure dans la langue, le format et le fuseau horaire corrects. N'hésitez pas à le copier.

Par exemple, passer "2019-05-30 18:06:01"(en UTC) reviendrait "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 );

}

Les références:


-1

C'est ce qui semble fonctionner sur ma machine (aucune des autres choses n'a fonctionné):

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

Code d'origine: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

Il n'utilise pas date_l18n()mais je suppose qu'on pourrait l'utiliser plus tard ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.