Tarih damgalarını date_l18n () ile yerel saate dönüştürme


15

Periyodik olarak bir e-posta gönderen ve seçenek olarak gönderildiğinde zaman damgasını kaydeden bir WordPress cron işim var ve bir ayarlar sayfasında bir tarih görüntülemek istiyorum. "Son e-posta" x "tarihinde gönderildi" gibi bir şey. ABD'nin batı kıyısındayım, bu yüzden zamanımız UTC'den yedi saat uzakta.

Date_i18n () 'den zaman damgasını ileten beklenen çıktım, UTC'den yedi saatlik bir ayarlama ile yerel olarak biçimlendirilmiş bir tarih olacaktır. Ancak, saati UTC olarak döndürür. Hatta şimdiki zaman almaya çalışırken beklenen çıktı olacağını düşündüğüm dönmüyor.

Örneğin: echo date_i18n('F d, Y H:i');05 Nisan 2013 11:36 echo date_i18n('F d, Y H:i',time());çıktıları beklendiği gibi, ancak 05 Nisan 2013 18:36 çıktıları.

Bu kasıtlı mı? Önceden varolan bir zaman damgasından yerel olarak biçimlendirilmiş bir tarihi nasıl döndürebilirim? Herhangi bir yardım için teşekkürler.


Saat diliminizi Ayarlar-> Genel'de ayarladınız mı?
vancoder

Evet, Los Angeles'a.
Andrew Bartel

Yanıtlar:


31

Üç ay geç kaldığımı biliyorum, ama burada istediğiniz fonksiyon WordPress ' get_date_from_gmt().

İşlev, GMT / UTC tarih Y-m-d H:i:sbiçimini ilk parametre olarak ve istediğiniz tarih biçimini ikinci parametre olarak kabul eder. Tarihinizi Ayarlar ekranında ayarlanan yerel saat dilimine dönüştürür.

Örnek kullanım:

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


2
Katil teşekkürler, şu anda bildirimlerimde bu açılır pencereyi gördüm. Doğru cevaba geçtim.
Andrew Bartel

1
Tarih ve saat yapılandırmasını echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
ekledim

@ NabilKadimi bu harika bir ektir, ancak yine de dizeyi doğru dile çevirmez. Yapılandırılan dil, saat dilimi ve tarih biçiminin üçünü de dikkate alan bir işlev için cevabımı görün .
Flimm

5

Gönderen kodeksine :

blog'un yerel saatini döndürmek için current_time ('timestamp') zaman yerine () kullanılmalıdır. WordPress'de PHP'nin time () değeri daima UTC döndürür ve current_time ('timestamp', true) çağrılmasıyla aynıdır.

Bunu dene:

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

Bu, varsayılan PHP tarihini WP'nin komut dosyası süresince varsa timezone_string seçeneğine ayarlar.


1
Doğru, ama keyfi bir zaman damgası varsa? Birkaç gün önce, UTC zamanından ziyade ayarlanan zamanı nasıl alabilirim?
Andrew Bartel

çalışmıyor date_i18n('F d, Y H:i', $your_timestamp)?
vancoder

Hayır, 2012'de vanilya WP kurulumunda bile denedi, bu echo date_i18n('F d, Y H:i',1365194723)ifadeyi index.php'nin üst kısmında çalıştırdı , bu da bana ABD West Coast zamanı yerine UTC veriyor.
Andrew Bartel

Haklısınız, date_i18n, tarih ayarlaması yerine esas olarak tarihlerin yerel olarak biçimlendirilmesi içindir . Cevabımı güncelledim.
vancoder

Evet, saat dilimini manuel olarak ayarlamaktan kaçınmayı umuyordum, ama tek yol buysa, öyle olsun. Yanıt olarak işaretlendi, yardım için teşekkürler.
Andrew Bartel

2

date_i18n($format, $timestamp)yerel ayara göre biçimlendirir, ancak saat dilimine göre değil. get_date_from_gmt($datestring, $format)zaman dilimine göre biçimlendirir, ancak yerel ayara göre değil. Hem saat dilimi hem de yerel ayara göre biçimlendirme almak için aşağıdakileri yapıyorum:

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

Örnek program:

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

Los Angeles saat dilimi için çıktı:

Yerel: 05 Nisan 2013 11:36 UTC: 05 Nisan 2013 18:36

Referanslar:


0

Zaman damganıza saat dilimi uzaklığı ekleyin.

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

ya da daha iyisi;

$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

WordPress seçeneklerinde UTC'yi saat dilimi, dil ve biçimde dizeye dönüştürme

UTC'de bir tarih-saat dizesini doğru dil, biçim ve saat diliminde güzel bir tarih-saat dizesine dönüştüren iyi belge işlevi oluşturdum. Kopyalamaktan çekinmeyin.

Örneğin, "2019-05-30 18:06:01"(UTC olarak) iletmek geri döner "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 );

}

Referanslar:


-1

Makinemde işe yarayan şey budur (diğer şeylerin hiçbiri işe yaramadı):

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

Orijinal kod: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

Kullanmıyor date_l18n()ama sanırım daha sonra kullanabilirsiniz ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.