ใครสามารถบอกวิธีการตั้งค่าเขตเวลาใน WordPress Admin ได้ไหม
ตัวอย่างเช่นหากบล็อกถูกตั้งค่าเป็นเวลาตะวันออกฉันต้องการสตริงที่แน่นอนนี้เพื่อพิมพ์:
สหรัฐฯ / ตะวันออก
นี่สำหรับฟังก์ชั่นที่ใช้งานอยู่ใน functions.php ในชุดรูปแบบของฉัน
ใครสามารถบอกวิธีการตั้งค่าเขตเวลาใน WordPress Admin ได้ไหม
ตัวอย่างเช่นหากบล็อกถูกตั้งค่าเป็นเวลาตะวันออกฉันต้องการสตริงที่แน่นอนนี้เพื่อพิมพ์:
สหรัฐฯ / ตะวันออก
นี่สำหรับฟังก์ชั่นที่ใช้งานอยู่ใน functions.php ในชุดรูปแบบของฉัน
คำตอบ:
หากคุณต้องการ gmt_offset
<?php echo get_option('gmt_offset'); ?>
นี้จะทำให้คุณเป็นจำนวนเต็มเช่น2 หรือ -2
และถ้าคุณต้องการใช้สตริงเขตเวลา
<?php echo get_option('timezone_string'); ?>
สิ่งนี้จะทำให้คุณมีสายเหมือนAmerica / Indianapolis
สถานการณ์ที่โชคร้ายคือมีสองตัวเลือกที่แตกต่างกัน:
timezone_string
ซึ่งจะบันทึกโซนเวลาสไตล์ PHPgmt_offset
ซึ่งช่วยชดเชยการลอยของตัวเลขในหน่วยชั่วโมงแต่ในสภาพแวดล้อมที่ใหม่กว่าการแทนที่timezone_string
จริงค่าที่ส่งคืนโดยหลังจะขึ้นอยู่กับอดีต อย่างไรก็ตามสิ่งที่ตรงกันข้ามไม่เป็นความจริง - อาจใช้ได้ในขณะที่ว่างเปล่า gmt_offset
gmt_offset
timezone_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 );
}
}
วิธีนี้จะพยายามสร้างอินสแตนซ์ของวัตถุโซนเวลาที่มีความหมายในทุกกรณีที่เป็นไปได้ตราบใดที่มีข้อมูลใด ๆ
(int)
เป็นเวลา $ ชั่วโมงและfloor
เป็นปัญหา $ นาทีใช่ไหม ตามเอกสาร(int)
และfloor
เกือบจะเหมือนกันยกเว้น(int)
จะปัดตั้งแต่ -4.5 ถึง -4 และfloor
จะปัดเป็น -5 ดูเหมือนว่าจะให้การชดเชยเขตเวลาที่ไม่ถูกต้องในเชิงลบหรือไม่
อย่าคิดว่าคุณจะได้รับสตริงเช่น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.
?>
ในการเพิ่ม Bainternet (ฉันเพิ่มสิ่งนี้เป็นคำตอบเพราะฉันไม่สามารถแสดงความคิดเห็นได้ - ฉันมีคะแนนน้อยกว่า 50 คะแนนในกองพัฒนา WP)
WordPress จะเก็บสตริงเขตเวลาเฉพาะเมื่อคุณเลือกสตริงเขตเวลาในการตั้งค่าทั่วไป การเลือก UTF เป็นที่ที่ค่าเริ่มต้นในรายการ แต่คุณสามารถเลื่อนไปจนถึงสตริงเขตเวลา หากคุณตั้งค่าสตริงเขตเวลาทั้ง UTF และสตริงเขตเวลาจะถูกตั้งค่า มันจะเหมือนกัน (หมายถึง UTF จะถูกรีเซ็ตเป็นโซนใหม่เมื่อคุณเลือกเขตเวลาของสตริงเขตเวลา)
(WordPress 4)
มีตัวเลือกไม่กี่ตัวเลือกซึ่งไม่มีประโยชน์ใด ๆ เลย นี่เป็นข้อผิดพลาดของ 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)
รหัสเพื่อรับการประทับเวลาที่ ถูกต้องจริง
จากข้อเท็จจริงที่ว่าเวิร์ดเพรสรักษาสตริงเขตเวลาในตารางตัวเลือกคุณสามารถใช้วิธีการเชิงวัตถุเพื่อให้ได้เวลาที่เหมาะสมในไซต์เวิร์ดเพรสของคุณ:
$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);
$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";