การแปลงเวลาบันทึกเป็นเวลาท้องถิ่นด้วย date_l18n ()


15

ฉันมีงาน WordPress cron ที่ส่งอีเมลเป็นระยะและบันทึกเวลาเมื่อมันถูกส่งเป็นตัวเลือกและฉันต้องการแสดงวันที่บนหน้าการตั้งค่า "อีเมลล่าสุดถูกส่งไปที่ 'x'" ฉันอยู่บนชายฝั่งตะวันตกของสหรัฐอเมริกาดังนั้นเวลาของเราจึงปิด UTC ในเวลาเจ็ดชั่วโมง

ผลลัพธ์ที่คาดหวังของฉันจาก date_i18n () ผ่านการประทับเวลาจะเป็นวันที่จัดรูปแบบในประเทศโดยมีการปรับเจ็ดชั่วโมงจาก UTC อย่างไรก็ตามจะส่งคืนเวลาใน UTC แม้แต่การพยายามรับเวลาปัจจุบันก็ไม่ได้กลับไปสู่สิ่งที่ฉันคิดว่าน่าจะเป็นผลลัพธ์ที่คาดหวัง

ตัวอย่างเช่น: echo date_i18n('F d, Y H:i');เอาท์พุท 5 เมษายน 2013 11:36 ตามที่คาดไว้ แต่echo date_i18n('F d, Y H:i',time());เอาท์พุท 5 เมษายน 2013 18:36

มันตั้งใจหรือไม่ ฉันจะส่งคืนวันที่จัดรูปแบบในประเทศจากการประทับเวลาที่มีอยู่ก่อนหน้าได้อย่างไร ขอบคุณสำหรับความช่วยเหลือ


คุณได้ตั้งค่าเขตเวลาของคุณในการตั้งค่า -> ทั่วไปหรือไม่
vancoder

ใช่ไปลอสแองเจลิส
Andrew Bartel

คำตอบ:


31

ฉันรู้ว่าฉันสามเดือนปลาย แต่ฟังก์ชั่นที่คุณต้องการที่นี่คือ WordPress'get_date_from_gmt()

ฟังก์ชั่นยอมรับวันที่ GMT / UTC ในY-m-d H:i:sรูปแบบเป็นพารามิเตอร์แรกและรูปแบบวันที่ที่คุณต้องการเป็นพารามิเตอร์ที่สอง มันจะแปลงวันที่ของคุณเป็นเขตเวลาท้องถิ่นตามที่กำหนดไว้ในหน้าจอการตั้งค่า

ตัวอย่างการใช้งาน:

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


2
ขอขอบคุณ Killer เห็นป๊อปอัปนี้ในการแจ้งเตือนของฉันตอนนี้ ฉันเปลี่ยนเป็นคำตอบที่ถูกต้อง
Andrew Bartel

1
ฉันเพิ่มการกำหนดค่าวันที่และเวลา: echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
นาบิลคาดิมิ

@NabilKadimi เป็นส่วนเสริมที่ยอดเยี่ยม แต่ก็ยังไม่สามารถแปลสตริงเป็นภาษาที่ถูกต้องได้ ดูคำตอบของฉันสำหรับฟังก์ชั่นที่คำนึงถึงทั้งสามภาษากำหนดเขตเวลาและรูปแบบวันที่
Flimm

5

จากcodex :

current_time ('timestamp') ควรใช้แทน () เพื่อส่งคืนเวลาท้องถิ่นของบล็อก ใน WordPress เวลาของ PHP () จะส่งคืน UTC เสมอและเหมือนกับการเรียก current_time ('timestamp', true)

ลองสิ่งนี้:

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

สิ่งนี้ตั้งค่าวันที่ PHP เริ่มต้นเป็นตัวเลือก timezone_string ของ WP หากมีสำหรับช่วงเวลาของสคริปต์


1
ใช่ แต่ถ้าฉันมีการประทับเวลาโดยพลการ พูดจากสองสามวันที่ผ่านมาฉันจะปรับเวลาได้อย่างไรแทนที่จะเป็นเวลา UTC?
Andrew Bartel

ไม่date_i18n('F d, Y H:i', $your_timestamp)ได้ทำงาน?
vancoder

ไม่เลยลองติดตั้ง vanilla WP กับ 2012 เพียงแค่เรียกใช้echo date_i18n('F d, Y H:i',1365194723)คำสั่งนี้ที่ด้านบนของ index.php ซึ่งให้ UTC กับฉันมากกว่าเวลาฝั่งตะวันตกของสหรัฐอเมริกา
Andrew Bartel

คุณพูดถูกดูเหมือนว่า date_i18n ส่วนใหญ่จะใช้ในการจัดรูปแบบวันที่ในท้องถิ่นแทนที่จะเป็นการปรับวันที่ ฉันได้อัพเดตคำตอบแล้ว
vancoder

ใช่ฉันหวังว่าจะไม่ต้องตั้งค่าเขตเวลาด้วยตนเอง แต่ถ้าเป็นวิธีเดียว ทำเครื่องหมายว่าตอบแล้วขอบคุณสำหรับความช่วยเหลือ
Andrew Bartel

2

date_i18n($format, $timestamp)จัดรูปแบบตามโลแคล แต่ไม่ใช่เขตเวลา get_date_from_gmt($datestring, $format)จัดรูปแบบตามเขตเวลา แต่ไม่ใช่สถานที่ ในการรับการจัดรูปแบบตามเขตเวลาและสถานที่ฉันกำลังทำสิ่งต่อไปนี้:

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

โปรแกรมตัวอย่าง:

$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:

เวลาท้องถิ่น: 5 เมษายน 2013 11:36 UTC: 5 เมษายน 2556 18:36

อ้างอิง:


0

เพิ่มเขตเวลาชดเชยให้กับการประทับเวลาของคุณ

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

หรือดีกว่า;

$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

การแปลง UTC เป็นสตริงในเขตเวลาภาษาและรูปแบบในตัวเลือกของ WordPress

ฉันได้สร้างฟังก์ชั่นเอกสารที่ดีที่แปลงสตริงวันที่ใน UTC เป็นสตริงวันที่และเวลาที่ถูกต้องในภาษารูปแบบและเขตเวลาที่ถูกต้อง รู้สึกฟรีเพื่อคัดลอก

ยกตัวอย่างเช่นในการส่งผ่าน"2019-05-30 18:06:01"(เวลา UTC) "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 );

}

อ้างอิง:


-1

นี่คือสิ่งที่ดูเหมือนว่าจะทำงานบนเครื่องของฉัน (ไม่มีสิ่งอื่นใดทำงาน):

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

รหัสเดิม: https://www.simonholywell.com/post/2013/12/convert-utc-to-local-time/

ไม่ได้ใช้date_l18n()แต่ฉันคิดว่าจะใช้ภายหลังได้ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.