php.iniの設定を変えずに強制的に日本時間を取得する

サーバー、OSの設定に依存せずに強制的に目的のタイムゾーンの時間を得る方法の紹介です。

OSのタイムゾーンが違う場合は、
date_default_timezone_set(‘Asia/Tokyo’);
等の関数である程度は変えることが出来ますが、
cron処理内など、この関数を用いてもタイムゾーンを変えることが出来ない場合があります。
そんな時に、目的のタイムゾーンの時間を得る方法です。

強制的に目的のタイムゾーンの時刻を得る方法

OSの時計とは別にDateTimeオブジェクトで自分の時計を作ります。

<?php
$mytime =  $mytime = new DateTime('now');
?>

この時点では、自分時計$mytimeはOSと同じ時刻を刻んでます。
そこで、setTimezoneメソッドを使って目的のタイムゾーンに設定すれば、
php.iniの設定も、OSのタイムゾーンも関係なく、簡単に任意のタイムゾーンの時刻を得ることが出来ます。

では実際にやってみます。

<?php
echo "<br>";
echo "タイムゾーン<br>";
echo "<br>";

$mytime = new DateTime('now');
$mytime->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo "日本     ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('Europe/London'));
echo "ロンドン   ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('Europe/Moscow'));
echo "モスクワ   ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('America/New_York'));
echo "ニューヨーク ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('Africa/Nairobi'));
echo "ナイロビ   ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('Australia/Melbourne'));
echo "メルボルン  ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->setTimezone(new DateTimeZone('Pacific/Honolulu'));
echo "ホノルル   ".$mytime->format('Y/m/d H:i:s')."<br>";
?>
【実行結果】
タイムゾーン

日本     2019/10/31 10:12:16
ロンドン   2019/10/31 01:12:16
モスクワ   2019/10/31 04:12:16
ニューヨーク 2019/10/30 21:12:16
ナイロビ   2019/10/31 04:12:16
メルボルン  2019/10/31 12:12:16
ホノルル   2019/10/30 15:12:16

これを応用して海外のある時刻から日本時間を得る方法は、

<?php
$mytime = new DateTime();
$mytime->setTimezone(new DateTimeZone('Europe/London'));
$mytime->setDate(2019, 1, 23)->setTime(12, 45, 17);
$mytime->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo "ロンドン時間2019/1/23 12:45:17は、日本時間では".$mytime->format('Y/m/d H:i:s')."<br>";
?>
【実行結果】
ロンドン時間2019/1/23 12:45:17は、日本時間では2019/01/23 21:45:17

DateTimeオブジェクトでの日時の計算

自分専用の時計で時刻計算する方法です。
色々と方法はありますが、modify メソッドを利用する方法を紹介します。

基本的には、以下のような構文です。

$mytime = new DateTime(‘now’);
$mytime->setTimezone(new DateTimeZone(‘Asia/Tokyo’));

$mytime->modify(‘-n second[s]’)); // n秒前の日時
$mytime->modify(‘-n minute[s]’)); // n分前の日時
$mytime->modify(‘-n hour[s]’)); // n時間前の日時
$mytime->modify(‘-n day[s]’)); // n日前の日時
$mytime->modify(‘-n month[s]’)); // n月前の日時
$mytime->modify(‘-n year[s]’)); // n年前の日時
$mytime->modify(‘-n week[s]’)); // n週間前の日時
$mytime->modify(‘-n Thursday’)); // n回前の木曜日の日時

$mytime->modify(‘+n second[s]’)); // n秒後の日時
$mytime->modify(‘+n minute[s]’)); // n分後の日時
$mytime->modify(‘+n hour[s]’)); // n時間後の日時
$mytime->modify(‘+n day[s]’)); // n日後の日時
$mytime->modify(‘+n month[s]’)); // n月後前の日時
$mytime->modify(‘+n year[s]’)); // n年後の日時
$mytime->modify(‘+n week[s]’)); // n週間後の日時
$mytime->modify(‘+n Thursday’)); // n回後の木曜日の日時
[]内は省略可

では、実際にやってみます。

<?php
echo "<br>";
echo "時間の計算<br>";
echo "<br>";


$mytime->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo "日本 現在時刻 ".$mytime->format('Y/m/d H:i:s')."<br>";

$mytime->modify('-15 seconds');
echo "日本 15秒前 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('-4 minute');
echo "日本  4分前 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('+3 hour');
echo "日本 3時間後 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('+6 day');
echo "日本  6日後 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('-7 month');
echo "日本 7ヶ月前 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('+5 year');
echo "日本  5年後 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('-2 week');
echo "日本 2週間前 ".$mytime->format('Y/m/d H:i:s')."<br>";


$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('-2 day -4 hour -13 minute');
echo "日本 2日と4時間13分前 ".$mytime->format('Y/m/d H:i:s')."<br>";


echo "<br>";
echo "<br>";
echo "<br>";



$mytime->setTimestamp(time());          // 現在時刻

$mytime->modify('-6 Thursday');
echo "日本 6回前の木曜日".$mytime->format('Y/m/d H:i:s')."<br>";
?>
【実行結果】

時間の計算

日本 現在時刻 2019/10/31 11:53:58
日本 15秒前 2019/10/31 11:53:43
日本  4分前 2019/10/31 11:49:58
日本 3時間後 2019/10/31 14:53:58
日本  6日後 2019/11/06 11:53:58
日本 7ヶ月前 2019/03/31 11:53:58
日本  5年後 2024/10/31 11:53:58
日本 2週間前 2019/10/17 11:53:58
日本 2日と4時間13分前 2019/10/29 07:40:58

日本 6回前の木曜日2019/09/19 00:00:00

曜日計算では、時刻が00:00:00になるようです。

date_default_timezone_set(()関数が有効な場合の日時の計算

date_default_timezone_set(()関数でタイムゾーンを切り替えることが出来た場合は、
通常のdate()関数を使った方が簡単です。

基本的な構文は、以下になります。

date(‘Y/m/d H:i:s’, strtotime(‘-n second[s]’)); // n秒前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n minute[s]’)); // n分前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n hour[s]’)); // n時間前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n day[s]’)); // n日前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n month[s]’)); // n月前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n year[s]’)); // n年前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n week[s]’)); // n週間前の日時
date(‘Y/m/d H:i:s’, strtotime(‘-n Thursday’)); // n回前の木曜日の日時

date(‘Y/m/d H:i:s’, strtotime(‘+n second[s]’)); // n秒後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n minute[s]’)); // n分後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n hour[s]’)); // n時間後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n day[s]’)); // n日後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n month[s]’)); // n月後前の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n year[s]’)); // n年後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n week[s]’)); // n週間後の日時
date(‘Y/m/d H:i:s’, strtotime(‘+n Thursday’)); // n回後の木曜日の日時
[]内は省略可

php.iniの設定を変えずに強制的に日本時間を取得するまとめ

Cron処理内で、動作のログを録ってたのですがログタイムがおかしいことに気付き調べてのですが、
date_default_timezone_set(()関数ではタイムゾーンがを変えることが出来ていないようでした。

この方法を使うことにより、Cron処理で、タイムゾーンがUTCになっていても、
日本(または希望の国)の時刻を得ることが出来ました。