Làm cách nào để có được cài đặt Múi giờ của WordPress?


50

Ai đó có thể cho tôi biết cách lấy múi giờ được đặt trong Quản trị viên WordPress không?

Ví dụ: nếu blog được đặt thành giờ phương Đông, tôi cần chuỗi chính xác này để in ra:

Mỹ / Đông

Đây là một chức năng sống trong hàm.php trong chủ đề của tôi.

Câu trả lời:


79

nếu bạn cần gmt_offset thì

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

điều này sẽ cung cấp cho bạn một số nguyên như 2 hoặc -2 .

và nếu bạn cần sử dụng chuỗi múi giờ

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

điều này sẽ cung cấp cho bạn một chuỗi như America / Indianapolis


6
Timezone_ chuỗi của tôi nằm trong cơ sở dữ liệu nhưng nó trống, ngay cả sau khi chọn một múi giờ khác trên trang cài đặt. Điều gì có thể là trường hợp? (WP3.6)
dùng2019515

Gmt_offest có tiết kiệm ánh sáng ban ngày vào tài khoản dựa trên cài đặt múi giờ của trang web không?
squarecandy

6
@ user2019515 Nếu bạn chọn thành phố làm múi giờ, nó sẽ lưu vào tùy chọn "timezone_opes" nhưng nếu bạn chọn Offset thủ công (ví dụ UTC + 1), nó sẽ được lưu vào tùy chọn "gmt_offset" (như "1") và timezone_ chuỗi vẫn trống rỗng
Berend

15

Tình huống không may là thực sự có hai lựa chọn khác nhau:

  1. Mới hơn timezone_string, giúp tiết kiệm múi giờ kiểu PHP.
  2. Cũ hơn gmt_offset, giúp tiết kiệm số float bù theo giờ.

Nhưng trong các môi trường mới hơn timezone_stringthực sự ghi đè gmt_offset , giá trị được trả về sau sẽ dựa trên giá trị trước. Tuy nhiên, điều ngược lại không đúng - gmt_offsetcó thể hợp lệ, trong khi timezone_stringtrống rỗng.

Tôi đã dành khá nhiều thời gian cho những thứ này, và cách thức mới nhất tôi thực hiện trong WpDateTimethư viện của mình là:

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

Điều này sẽ cố gắng khởi tạo một đối tượng múi giờ có ý nghĩa trong tất cả các trường hợp có thể, miễn là có bất kỳ thông tin nào có sẵn.


1
Đây phải là câu trả lời được chấp nhận. Mọi người sẽ gặp phải lỗi nếu họ chỉ dựa vào get_option ('timezone_opes').
DiscoInfiltrator

Đây là câu trả lời chính xác.
Lucas Bustamante

Không sử dụng (int)cho $ giờ và floor$ phút có vấn đề? Theo tài liệu, (int)floorgần như giống nhau ngoại trừ (int)sẽ làm tròn -4,5 đến -4 và floorsẽ làm tròn thành -5. Điều này có vẻ như nó sẽ cung cấp cho các múi giờ âm không chính xác?
Mikepote

1
@Mikepote yeah, điều này đã được sửa trong lib từ lâu, chỉ cần sao chép mã trong câu trả lời ở đây.
Hiếm

Oh my god tại sao họ thực hiện nó như thế này .... Nó dự trù kinh phí cho tôi một giờ đầy đủ độ nghiêng
Blackbam


2

Đừng nghĩ rằng bạn sẽ có được một chuỗi như US / Eastern mà không lưu trữ tất cả các chuỗi bạn muốn trong một mảng và tham chiếu đến chúng. Sử dụng PHP bạn có thể có được chữ viết tắt múi giờ, tức là EST ; và nếu bạn có các giá trị đó được lưu trữ trong một mảng với các chuỗi bạn muốn, bạn có thể tra cứu chúng.

<?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.
 ?>

Điều này là không cần thiết. Các tiêu chuẩn múi giờ là một phần của PHP kể từ 5.2, cũng như đối tượng DateTimeZone và các hàm tiêu chuẩn liên quan.
haz

1

Để thêm vào BaiNET (Tôi thêm câu này dưới dạng câu trả lời vì tôi không thể nhận xét - Tôi có ít hơn 50 điểm trên ngăn xếp Phát triển WP).

WordPress sẽ chỉ lưu trữ chuỗi múi giờ nếu bạn chọn chuỗi múi giờ trong cài đặt chung. Lựa chọn UTF là nơi nó mặc định trong danh sách, nhưng bạn có thể cuộn lên tới các chuỗi múi giờ. Nếu bạn đặt chuỗi múi giờ, cả chuỗi UTF và chuỗi múi giờ sẽ được đặt. Chúng sẽ giống nhau (có nghĩa là UTF được đặt lại thành vùng mới khi bạn chọn múi giờ chuỗi thời gian).

(WordPress 4)


0

Có một vài lựa chọn, không có lựa chọn nào thực sự hiệu quả. Đây là một lỗi của WordPress và nó thực sự rất tệ bởi vì thời gian là sai trừ khi bạn đặt trang web của mình thành UTC ... điều này gây nhầm lẫn và không phải lúc nào cũng có thể.

Mã tiếp theo này tôi nghĩ chỉ hoạt động nếu bạn chọn Múi giờ của mình (Trong Cài đặt -> Chung trong quản trị viên) làm thành phố được đặt tên thay vì bù vào số GMT. Tôi đã không kiểm tra điều này nhưng rất có thể nó get_option('gmt_offset')được đặt khi get_option('timezone_string')không.

date_default_timezone_set(get_option('timezone_string'));

Nhược điểm của việc này là WordPress giả định PHP được đặt thành UTC khi tạo dấu thời gian mysql, do đó bạn có thể làm xáo trộn cơ sở dữ liệu của mình một chút bất cứ khi nào bạn chuyển đổi múi giờ! Chưa kể các plugin WP khác có thể cho rằng môi trường PHP luôn ở trong UTC.

Vì vậy, nếu bạn chỉ muốn có thời gian chính xác - bạn có thể buộc dấu thời gian của mình ở trong UTC với:

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

Thật không may, mặc dù đúng, nó sẽ làm cho múi giờ được đặt thành UTC.

Và lưu ý rằng cả hai bạn không thể sử dụng cờ "thật" hàm timezone_set mặc định.

Bất kỳ giải pháp thích hợp nào cũng sẽ là một đoạn mã chiếm cả gmt_offsetAND timezone_stringvà sử dụng chúng để đặt múi giờ trên một số đầu vào. WP giả định rằng PHP được đặt thành UTC khi thực hiện dấu thời gian mysql và nó có thể phá vỡ các plugin khác.

Có một giải pháp như vậy trên https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ nhưng, một lần nữa đây là BUG, ​​vì vậy bạn nên sử dụng get_post_time($date_format, TRUE)mã để có dấu thời gian là thực sự chính xác.


0

Vì thực tế là wordpress giữ chuỗi múi giờ trong bảng tùy chọn, bạn có thể sử dụng cách hướng đối tượng để lấy đúng thời gian trên trang web wordpress của mình:

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

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.