วิธีการตั้งค่าโซนเวลาของ WordPress


50

ใครสามารถบอกวิธีการตั้งค่าเขตเวลาใน WordPress Admin ได้ไหม

ตัวอย่างเช่นหากบล็อกถูกตั้งค่าเป็นเวลาตะวันออกฉันต้องการสตริงที่แน่นอนนี้เพื่อพิมพ์:

สหรัฐฯ / ตะวันออก

นี่สำหรับฟังก์ชั่นที่ใช้งานอยู่ใน functions.php ในชุดรูปแบบของฉัน

คำตอบ:


79

หากคุณต้องการ gmt_offset

<?php echo get_option('gmt_offset'); ?>

นี้จะทำให้คุณเป็นจำนวนเต็มเช่น2 หรือ -2

และถ้าคุณต้องการใช้สตริงเขตเวลา

<?php echo get_option('timezone_string'); ?>

สิ่งนี้จะทำให้คุณมีสายเหมือนAmerica / Indianapolis


6
timezone_string ของฉันอยู่ในฐานข้อมูล แต่ว่างเปล่าแม้หลังจากเลือกเขตเวลาอื่นในหน้าการตั้งค่า มีกรณีอะไรบ้าง? (WP3.6)
user2019515

gmt_offest คำนึงถึงการประหยัดเวลากลางวันตามการตั้งค่าเขตเวลาของไซต์หรือไม่
squarecandy

6
@ user2019515 หากคุณเลือกเมืองเป็นเขตเวลามันจะบันทึกลงในตัวเลือก "timezone_string" แต่หากคุณเลือก Manual Offset (UTC + 1 เป็นต้น) จะถูกบันทึกไว้ในตัวเลือก "gmt_offset" (เป็น "1") และ timezone_string ยังคงว่างเปล่า
Berend

15

สถานการณ์ที่โชคร้ายคือมีสองตัวเลือกที่แตกต่างกัน:

  1. ใหม่กว่าtimezone_stringซึ่งจะบันทึกโซนเวลาสไตล์ PHP
  2. เก่ากว่าgmt_offsetซึ่งช่วยชดเชยการลอยของตัวเลขในหน่วยชั่วโมง

แต่ในสภาพแวดล้อมที่ใหม่กว่าการแทนที่timezone_stringจริงค่าที่ส่งคืนโดยหลังจะขึ้นอยู่กับอดีต อย่างไรก็ตามสิ่งที่ตรงกันข้ามไม่เป็นความจริง - อาจใช้ได้ในขณะที่ว่างเปล่า gmt_offsetgmt_offsettimezone_string

ฉันใช้เวลากับสิ่งเหล่านี้ไปเล็กน้อยและสิ่งที่ฉันได้นำไปใช้ในWpDateTimeห้องสมุดมากที่สุดคือ:

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determine time zone from WordPress options and return as object.
     *
     * @return static
     */
    public static function getWpTimezone() {
        $timezone_string = get_option( 'timezone_string' );
        if ( ! empty( $timezone_string ) ) {
            return new static( $timezone_string );
        }
        $offset  = get_option( 'gmt_offset' );
        $hours   = (int) $offset;
        $minutes = abs( ( $offset - (int) $offset ) * 60 );
        $offset  = sprintf( '%+03d:%02d', $hours, $minutes );
        return new static( $offset );
    }
}

วิธีนี้จะพยายามสร้างอินสแตนซ์ของวัตถุโซนเวลาที่มีความหมายในทุกกรณีที่เป็นไปได้ตราบใดที่มีข้อมูลใด ๆ


1
นี่ควรเป็นคำตอบที่ยอมรับได้ ผู้คนจะพบข้อผิดพลาดหากพวกเขาพึ่งพาเพียง get_option ('timezone_string')
DiscoInfiltrator

นี่คือคำตอบที่ถูกต้อง
Lucas Bustamante

ไม่ได้ใช้งาน(int)เป็นเวลา $ ชั่วโมงและfloorเป็นปัญหา $ นาทีใช่ไหม ตามเอกสาร(int)และfloorเกือบจะเหมือนกันยกเว้น(int)จะปัดตั้งแต่ -4.5 ถึง -4 และfloorจะปัดเป็น -5 ดูเหมือนว่าจะให้การชดเชยเขตเวลาที่ไม่ถูกต้องในเชิงลบหรือไม่
Mikepote

1
@ Mikepote ใช่แล้วนี่ได้รับการแก้ไขใน lib นานมาแล้วเพียงคัดลอกรหัสเก่าในคำตอบที่นี่
Rarst

โอ้พระเจ้าของฉันทำไมพวกเขาใช้มันเช่นนี้ .... มัน costed ฉันชั่วโมงเต็มเอียง
Blackbam

9

ตรวจสอบหน้าตัวเลือกการอ้างอิง ตัวเลือกgmt_offsetคืนค่าจำนวนเต็ม ตัวอย่างเช่นหากเขตเวลาถูกตั้งค่าเป็นเวลาตะวันออก (เช่นอเมริกา / New_York) gmt_offsetควรเป็น -5


2

อย่าคิดว่าคุณจะได้รับสตริงเช่นUS / Easternโดยไม่ต้องเก็บสตริงทั้งหมดที่คุณต้องการในอาร์เรย์และอ้างอิงถึงมัน การใช้ PHP คุณสามารถรับตัวย่อเขตเวลาเช่นEST ; และถ้าคุณมีค่าเหล่านั้นเก็บไว้ในอาร์เรย์ด้วยสตริงที่คุณต้องการคุณสามารถค้นหาได้

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // will give you three-character string like "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // should be what you want.
 ?>

สิ่งนี้ไม่จำเป็น มาตรฐานเขตเวลาได้เป็นส่วนหนึ่งของ PHP ตั้งแต่ 5.2 ในขณะที่มีวัตถุ DateTimeZoneและฟังก์ชั่นที่เกี่ยวข้องกับมาตรฐาน
Haz

1

ในการเพิ่ม Bainternet (ฉันเพิ่มสิ่งนี้เป็นคำตอบเพราะฉันไม่สามารถแสดงความคิดเห็นได้ - ฉันมีคะแนนน้อยกว่า 50 คะแนนในกองพัฒนา WP)

WordPress จะเก็บสตริงเขตเวลาเฉพาะเมื่อคุณเลือกสตริงเขตเวลาในการตั้งค่าทั่วไป การเลือก UTF เป็นที่ที่ค่าเริ่มต้นในรายการ แต่คุณสามารถเลื่อนไปจนถึงสตริงเขตเวลา หากคุณตั้งค่าสตริงเขตเวลาทั้ง UTF และสตริงเขตเวลาจะถูกตั้งค่า มันจะเหมือนกัน (หมายถึง UTF จะถูกรีเซ็ตเป็นโซนใหม่เมื่อคุณเลือกเขตเวลาของสตริงเขตเวลา)

(WordPress 4)


0

มีตัวเลือกไม่กี่ตัวเลือกซึ่งไม่มีประโยชน์ใด ๆ เลย นี่เป็นข้อผิดพลาดของ WordPress และจริงๆแล้วมันแย่มากเพราะเวลาผิดปกติเว้นแต่คุณจะตั้งค่าเว็บไซต์ของคุณเป็น UTC ... ซึ่งทำให้เกิดความสับสน

รหัสต่อไปนี้ฉันคิดว่าใช้ได้เฉพาะเมื่อคุณเลือกเขตเวลาของคุณ (ภายใต้การตั้งค่า -> ทั่วไปในผู้ดูแลระบบ) เป็นเมืองที่มีชื่อแทนด้วยการชดเชยหมายเลข GMT ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่เป็นไปได้มากที่get_option('gmt_offset')จะตั้งเมื่อget_option('timezone_string')ไม่

date_default_timezone_set(get_option('timezone_string'));

ข้อเสียของสิ่งนี้คือ WordPress ถือว่า PHP ถูกตั้งค่าเป็น UTC เมื่อทำเวลาประทับ mysql ดังนั้นคุณสามารถทำให้ฐานข้อมูลของคุณสับสนเล็กน้อยเมื่อใดก็ตามที่คุณสลับเขตเวลา! ไม่ต้องพูดถึงปลั๊กอิน WP อื่น ๆ อาจสันนิษฐานว่าสภาพแวดล้อม PHP อยู่ใน UTC เสมอ

ดังนั้นหากคุณต้องการเวลาที่ถูกต้องคุณสามารถบังคับให้การประทับเวลาเป็น UTC ด้วย:

get_post_time('c', true); //should work for non-post objects.

น่าเสียดายที่แม้ว่าจะถูกต้อง แต่จะทำให้เขตเวลาตั้งค่าเป็น UTC

และโปรดทราบว่าคุณไม่สามารถใช้ทั้งค่าสถานะ "จริง" และฟังก์ชัน timezone_set ที่เป็นค่าเริ่มต้น

ใด ๆที่เหมาะสมการแก้ปัญหาคือ gonna เป็นรหัสข้อมูลโค้ดที่บัญชีสำหรับทั้งสองgmt_offsetและtimezone_stringและใช้เพื่อกำหนดเขตเวลากับการป้อนข้อมูลบางส่วน WP ถือว่า PHP ตั้งค่าเป็น UTC เมื่อทำเวลาประทับ mysql และอาจทำให้ปลั๊กอินอื่น ๆ เสียหาย

มีวิธีแก้ไขปัญหาหนึ่งดังกล่าวในhttps://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/แต่อีกครั้งนี่คือ BUG ดังนั้นคุณควรใช้get_post_time($date_format, TRUE)รหัสเพื่อรับการประทับเวลาที่ ถูกต้องจริง


0

จากข้อเท็จจริงที่ว่าเวิร์ดเพรสรักษาสตริงเขตเวลาในตารางตัวเลือกคุณสามารถใช้วิธีการเชิงวัตถุเพื่อให้ได้เวลาที่เหมาะสมในไซต์เวิร์ดเพรสของคุณ:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.