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
내 시간대 _ 문자열이 데이터베이스에 있지만 설정 페이지에서 다른 시간대를 선택한 후에도 비어 있습니다. 어떤 경우입니까? (WP3.6)
2019515

gmt_offest는 사이트의 시간대 설정에 따라 일광 절약 시간을 고려합니까?
squarecandy

6
@ user2019515 도시를 시간대로 선택하면 "timezone_string"옵션에 저장되지만 수동 오프셋 (예 : UTC + 1)을 선택하면 "gmt_offset"옵션 ( "1") 및 timezone_string에 저장됩니다 비어 있습니다.
Berend

15

불행한 상황은 실제로 두 가지 다른 옵션이 있다는 것입니다.

  1. timezone_stringPHP 스타일의 시간대를 절약하는 Newer
  2. Older gmt_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 );
    }
}

정보가 사용 가능한 한 가능한 모든 경우에 의미있는 표준 시간대 개체를 인스턴스화하려고 시도합니다.


1
이것이 정답입니다. 사람들이 get_option ( 'timezone_string')에만 의존하면 버그가 발생합니다.
DiscoInfiltrator

이것이 정답입니다.
Lucas Bustamante

의 밤은 사용 (int)$을위한 시간과 floor문제가있는 분 $ 하시나요? 문서에 따르면, (int)floor를 제외하고 거의 동일 (int)-4 -4.5 반올림하고 floor는 -5 반올림됩니다. 잘못된 음의 시간대 오프셋을 줄 것 같습니다.
Mikepote

1
@ Mikekee 예, 이것은 오래 전에 lib에서 수정되었습니다. 여기서 정답에 코드 사본이 오래되었습니다.
Rarst

오 마이 갓 왜 그들이 이런 식으로 그것을 구현 했습니까 .... 그것은 전체 시간 기울기
Blackbam


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

이것은 불필요합니다. 시간대 표준은 함에 따라 5.2부터 PHP의 일부가되었습니다 DateTimeZone 객체 와 관련된 표준 기능을.
haz

1

Bainternet에 추가하려면 (댓글을 달 수 없기 때문에 이것을 답변으로 추가하고 있습니다-WP 개발 스택에 50 점 미만입니다).

일반 설정에서 시간대 문자열을 선택하면 WordPress는 시간대 문자열 만 저장합니다. UTF 선택은 기본적으로 목록에서 사용되지만 시간대 문자열까지 스크롤 할 수 있습니다. 시간대 문자열을 설정하면 UTF와 시간대 문자열이 모두 설정됩니다. 그것들은 동일합니다 (즉, 시간대 문자열 시간대를 선택하면 UTF가 새로운 영역으로 재설정됩니다).

(워드 프레스 4)


0

몇 가지 옵션이 있지만 그중 어느 것도 실제로 효과적이지 않습니다. 이것은 WordPress 버그이며 사이트를 UTC로 설정하지 않으면 시간이 잘못되어 진정으로 짜증납니다. 혼란스럽고 항상 가능하지는 않습니다.

다음 코드는 GMT 번호 오프셋 대신 시간대 (관리자에서 설정-> 일반)를 명명 된 도시로 선택한 경우에만 작동한다고 생각합니다. 나는 이것을 테스트 하지 않았지만 그렇지 않을 get_option('gmt_offset')때 설정되는 get_option('timezone_string')것이 가능합니다 .

date_default_timezone_set(get_option('timezone_string'));

단점은 워드 프레스는 mysql 타임 스탬프를 만들 때 PHP가 UTC로 설정되어 있다고 가정하므로 시간대를 전환 할 때마다 데이터베이스를 약간 엉망으로 만들 수 있다는 것입니다! 다른 WP 플러그인은 PHP 환경이 항상 UTC라고 가정 할 수 있습니다.

따라서 정확한 시간을 원한다면 다음을 사용하여 타임 스탬프를 UTC로 강제 설정할 수 있습니다.

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

불행히도 정확하지만 시간대는 UTC로 설정됩니다.

"true"플래그 기본 timezone_set 함수를 모두 사용할 수는 없습니다 .

모든 적절한 솔루션은 거 모두 차지하는 코드 조각 할 수 있습니다 gmt_offsettimezone_string일부 입력에 시간대를 설정을 사용합니다. WP는 mysql 타임 스탬프를 수행 할 때 PHP가 UTC로 설정된 것으로 가정하고 다른 플러그인을 중단 할 수 있습니다.

https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ 에는 이러한 솔루션 이 있지만 다시 한 번 버그이므로 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.