date_l18n ()을 사용하여 타임 스탬프를 현지 시간으로 변환


15

이메일을 주기적으로 보내고 옵션으로 전송되었을 때 타임 스탬프를 저장하는 WordPress Cron 작업이 있는데 설정 페이지에 날짜를 표시하고 싶습니다. "마지막 이메일은 'x'로 전송되었습니다"와 같은 것입니다. 저는 미국 서해안에 있습니다. 그래서 우리 시간은 현재 UTC에서 7 시간입니다.

date_i18n ()의 예상 출력은 타임 스탬프를 전달하여 UTC에서 7 시간 조정 된 현지 형식의 날짜입니다. 그러나 UTC로 시간을 반환합니다. 현재 시간을 얻으려고해도 예상 된 결과가 될 것이라고 생각하는 것을 반환하지 않습니다.

예를 들면 : echo date_i18n('F d, Y H:i');예상대로 2013 년 4 월 5 일 11:36을 echo date_i18n('F d, Y H:i',time());출력 하지만 2013 년 4 월 5 일 18:36을 출력합니다.

이것은 의도적 인 것입니까? 기존 타임 스탬프에서 현지 형식의 날짜를 어떻게 반환합니까? 도움을 주셔서 감사합니다.


설정-> 일반에서 시간대를 설정 했습니까?
vancoder

예, 로스 앤젤레스에.
Andrew Bartel

답변:


31

3 개월 늦었다는 것을 알고 있지만 여기서 원하는 기능은 WordPress ' get_date_from_gmt()입니다.

이 함수는 Y-m-d H:i:s첫 번째 매개 변수로 형식 의 GMT / UTC 날짜 를, 두 번째 매개 변수로 원하는 날짜 형식을 승인합니다 . 설정 화면에서 설정 한대로 날짜를 현지 시간대로 변환합니다.

사용법 예 :

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


2
살인자 감사합니다, 지금 내 알림에서이 팝업을 보았습니다. 나는 그것을 정답으로 바꿨다.
앤드류 바텔

1
날짜 및 시간 구성을 추가했습니다. echo get_date_from_gmt ( date( 'Y-m-d H:i:s', $my_timestamp ), get_option('date_format') . ' - '. get_option('time_format') );
Nabil Kadimi

@NabilKadimi는 훌륭한 추가 기능이지만 여전히 문자열을 올바른 언어로 번역하지는 않습니다. 구성된 세 가지 언어, 시간대 및 날짜 형식을 모두 고려한 기능에 대한 내 대답 을 참조하십시오 .
Flimm

5

로부터 사본 :

블로그의 현지 시간을 반환하려면 time () 대신 current_time ( 'timestamp')을 사용해야합니다. WordPress에서 PHP의 time ()은 항상 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 날짜를 WP의 timezone_string 옵션 (사용 가능한 경우)으로 설정합니다.


1
하지만 임의의 타임 스탬프가 있으면 어떻게해야합니까? 며칠 전에 UTC 시간이 아닌 조정 시간을 어떻게 얻습니까?
Andrew Bartel

작동 date_i18n('F d, Y H:i', $your_timestamp)하지 않습니까?
vancoder

아니, 2012 년 echo date_i18n('F d, Y H:i',1365194723)index.php의 맨 위에서이 문장을 실행하여 바닐라 WP 설치에서도 시도해 보았습니다 . 미국 서해안이 아닌 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;

로스 앤젤레스 시간대의 출력 :

지역 : 2013 년 4 월 5 일 11:36 UTC : 2013 년 4 월 5 일 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

시간대, 언어 및 WordPress 옵션에서 형식으로 UTC를 문자열로 변환

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.