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を出力します。

これは意図的なものですか?既存のタイムスタンプからローカルにフォーマットされた日付を返すにはどうすればよいですか?助けてくれてありがとう。


[設定]-> [全般]でタイムゾーンを設定しましたか?
ヴァンコーダー

はい、ロサンゼルスへ。
アンドリューバーテル

回答:


31

3か月遅れていることはわかっていますが、ここで必要な機能はWordPress ' get_date_from_gmt()です。

この関数はY-m-d H:i:s、最初のパラメーターとして形式のGMT / UTC日付を受け入れ、2番目のパラメーターとして目的の日付形式を受け入れます。[設定]画面で設定されているように、日付がローカルタイムゾーンに変換されます。

使用例:

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') );
ナビルKadimi

@NabilKadimiはすばらしい機能ですが、文字列を正しい言語に翻訳しません。構成された3つの言語、タイムゾーン、および日付形式をすべて考慮に入れた関数についての私の答えを参照しください。
フリム

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時間ではなく調整された時間を取得するにはどうすればよいですか?
アンドリューバーテル

動作しませdate_i18n('F d, Y H:i', $your_timestamp)んか?
バンコーダー

いいえ、2012年のバニラWPインストールでも試してみましたが、echo date_i18n('F d, Y H:i',1365194723)index.phpの上部でこのステートメントを実行するだけで、米国西海岸時間ではなくUTCを取得できます。
アンドリューバーテル

確かに、date_i18nは日付調整ではなく、主に日付のローカルフォーマット用です。回答を更新しました。
バンコーダー

ええ、タイムゾーンを手動で設定する必要がなくなることを望んでいましたが、それが唯一の方法である場合は、そうしてください。回答済みとしてマークされ、助けてくれてありがとう。
アンドリューバーテル

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

UTCからWordPressのタイムゾーン、言語、形式の文字列への変換オプション

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.