Mengonversi stempel waktu ke waktu lokal dengan date_l18n ()

15

Saya mendapat pekerjaan WordPress cron yang mengirim email secara berkala dan menyimpan stempel waktu ketika dikirim sebagai opsi, dan saya ingin menampilkan tanggal pada halaman pengaturan. Sesuatu seperti, "Email terakhir dikirim pada 'x'". Saya berada di pantai barat AS, jadi waktu kami saat ini adalah tujuh jam dari UTC.

Output saya yang diharapkan dari date_i18n (), melewati timestamp, akan menjadi tanggal yang diformat secara lokal dengan penyesuaian tujuh jam dari UTC. Namun, ini mengembalikan waktu dalam UTC. Bahkan mencoba untuk mendapatkan waktu saat ini tidak mengembalikan apa yang saya pikir akan menjadi hasil yang diharapkan.

Sebagai contoh: echo date_i18n('F d, Y H:i');output 05 April 2013 11:36 seperti yang diharapkan, tetapi echo date_i18n('F d, Y H:i',time());output 05 April 2013 18:36.

Apakah ini disengaja? Bagaimana saya bisa mengembalikan tanggal yang diformat secara lokal dari cap waktu yang sudah ada sebelumnya? Terima kasih atas bantuannya.

Andrew Bartel
sumber
Sudahkah Anda menetapkan zona waktu di Pengaturan-> Umum?
vancoder
Ya, ke Los Angeles.
Andrew Bartel

Jawaban:

31

Saya tahu saya terlambat tiga bulan, tetapi fungsi yang Anda inginkan di sini adalah WordPress ' get_date_from_gmt().

Fungsi menerima tanggal GMT / UTC dalam Y-m-d H:i:sformat sebagai parameter pertama, dan format tanggal yang Anda inginkan sebagai parameter kedua. Ini akan mengonversi tanggal Anda ke zona waktu lokal seperti yang ditetapkan pada layar Pengaturan.

Contoh penggunaan:

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

John Blackbourn
sumber
2
Killer thanks, lihat munculan ini di notifikasi saya barusan. Saya beralih ke jawaban yang benar.
Andrew Bartel
1
Saya menambahkan konfigurasi tanggal dan waktu: 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 itu tambahan yang bagus, tetapi masih tidak menerjemahkan string ke bahasa yang benar. Lihat jawaban saya untuk fungsi yang memperhitungkan ketiga bahasa yang dikonfigurasi, zona waktu, dan format tanggal.
Flimm
5

Dari kodeks :

current_time ('timestamp') harus digunakan sebagai pengganti waktu () untuk mengembalikan waktu lokal blog. Di WordPress, waktu PHP () akan selalu mengembalikan UTC dan sama dengan memanggil current_time ('timestamp', true).

Coba ini:

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

Ini menetapkan tanggal PHP default ke opsi timezone_string WP, jika tersedia, selama durasi skrip.

vancoder
sumber
1
Benar, tetapi bagaimana jika saya memiliki cap waktu sewenang-wenang? Katakanlah dari beberapa hari yang lalu, bagaimana saya mendapatkan waktu yang disesuaikan daripada waktu UTC?
Andrew Bartel
tidak date_i18n('F d, Y H:i', $your_timestamp)tidak bekerja?
vancoder
Tidak, bahkan mencobanya pada instalasi vanilla WP dengan 2012 hanya menjalankan echo date_i18n('F d, Y H:i',1365194723)pernyataan ini di bagian atas index.php, yang memberi saya UTC daripada waktu Pantai Barat AS.
Andrew Bartel
Anda benar, sepertinya date_i18n terutama untuk memformat tanggal lokal , bukan penyesuaian tanggal. Saya telah memperbarui jawaban saya.
vancoder
Ya, saya berharap untuk tidak mengatur zona waktu secara manual, tetapi jika itu satu-satunya cara, biarlah. Ditandai sebagai dijawab, terima kasih atas bantuannya.
Andrew Bartel
2

date_i18n($format, $timestamp)format sesuai dengan lokal, tetapi bukan zona waktu. get_date_from_gmt($datestring, $format)format sesuai dengan zona waktu, tetapi bukan lokal. Untuk mendapatkan pemformatan menurut zona waktu dan lokal, saya melakukan hal berikut:

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

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

Output untuk zona waktu Los Angeles:

Lokal: 05 April 2013 11:36 UTC: 05 April 2013 18:36

Referensi:

antonakos
sumber
0

Tambahkan offset zona waktu ke stempel waktu Anda.

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

atau lebih baik;

$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 );
ecabuk
sumber
0

Konversi UTC ke string dalam zona waktu, bahasa dan format dalam opsi WordPress

Saya telah membuat fungsi dokumen yang mengubah string tanggal-waktu dalam UTC ke string tanggal-waktu yang cantik dalam bahasa, format, dan zona waktu yang tepat. Jangan ragu untuk menyalinnya.

Misalnya, lewat "2019-05-30 18:06:01"(dalam UTC) akan kembali "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 );

}

Referensi:

Flimm
sumber
-1

Inilah yang tampaknya bekerja pada mesin saya (tidak ada yang bekerja):

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

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

Itu tidak menggunakan date_l18n()tapi saya kira orang bisa menggunakannya nanti ...

Tidak seorangpun
sumber