タイムゾーンとは?
WEBサイトやWEBサービスではリアルタイムの時刻を表示したり、現在の日時によって異なる処理を行う場合があります。
それらは、日本からアクセスしているから自動的に日本の時刻になっているのではありません。タイムゾーンという設定を行うことで日本の時間が正しく取得されるようになっているのです。
タイムゾーンとはその名のとおり、時間によって世界の地域を区分けしたものです。UTC(協定世界時)というものを基準に、そこからの時差によって世界はいくつものエリアに分類されています。
このタイムゾーンの設定によってWEBサイトは、世界のどの地域の時刻を使用するかを決定しています。
制作するWEBサイトやWEBサービスで日本の時刻を扱うためにはタイムゾーンを正しく設定しておく必要があり、反対に日本であっても他の地域のタイムゾーンを設定することも可能です。
タイムゾーンの種類
下記に表示したように膨大な数のタイムゾーンが存在します。日本は「Asia/Tokyo」というタイムゾーンになります。
タイムゾーン一覧
- Africa/Abidjan
- Africa/Accra
- Africa/Addis_Ababa
- Africa/Algiers
- Africa/Asmara
- Africa/Bamako
- Africa/Bangui
- Africa/Banjul
- Africa/Bissau
- Africa/Blantyre
- Africa/Brazzaville
- Africa/Bujumbura
- Africa/Cairo
- Africa/Casablanca
- Africa/Ceuta
- Africa/Conakry
- Africa/Dakar
- Africa/Dar_es_Salaam
- Africa/Djibouti
- Africa/Douala
- Africa/El_Aaiun
- Africa/Freetown
- Africa/Gaborone
- Africa/Harare
- Africa/Johannesburg
- Africa/Juba
- Africa/Kampala
- Africa/Khartoum
- Africa/Kigali
- Africa/Kinshasa
- Africa/Lagos
- Africa/Libreville
- Africa/Lome
- Africa/Luanda
- Africa/Lubumbashi
- Africa/Lusaka
- Africa/Malabo
- Africa/Maputo
- Africa/Maseru
- Africa/Mbabane
- Africa/Mogadishu
- Africa/Monrovia
- Africa/Nairobi
- Africa/Ndjamena
- Africa/Niamey
- Africa/Nouakchott
- Africa/Ouagadougou
- Africa/Porto-Novo
- Africa/Sao_Tome
- Africa/Tripoli
- Africa/Tunis
- Africa/Windhoek
- America/Adak
- America/Anchorage
- America/Anguilla
- America/Antigua
- America/Araguaina
- America/Argentina/Buenos_Aires
- America/Argentina/Catamarca
- America/Argentina/Cordoba
- America/Argentina/Jujuy
- America/Argentina/La_Rioja
- America/Argentina/Mendoza
- America/Argentina/Rio_Gallegos
- America/Argentina/Salta
- America/Argentina/San_Juan
- America/Argentina/San_Luis
- America/Argentina/Tucuman
- America/Argentina/Ushuaia
- America/Aruba
- America/Asuncion
- America/Atikokan
- America/Bahia
- America/Bahia_Banderas
- America/Barbados
- America/Belem
- America/Belize
- America/Blanc-Sablon
- America/Boa_Vista
- America/Bogota
- America/Boise
- America/Cambridge_Bay
- America/Campo_Grande
- America/Cancun
- America/Caracas
- America/Cayenne
- America/Cayman
- America/Chicago
- America/Chihuahua
- America/Costa_Rica
- America/Creston
- America/Cuiaba
- America/Curacao
- America/Danmarkshavn
- America/Dawson
- America/Dawson_Creek
- America/Denver
- America/Detroit
- America/Dominica
- America/Edmonton
- America/Eirunepe
- America/El_Salvador
- America/Fort_Nelson
- America/Fortaleza
- America/Glace_Bay
- America/Godthab
- America/Goose_Bay
- America/Grand_Turk
- America/Grenada
- America/Guadeloupe
- America/Guatemala
- America/Guayaquil
- America/Guyana
- America/Halifax
- America/Havana
- America/Hermosillo
- America/Indiana/Indianapolis
- America/Indiana/Knox
- America/Indiana/Marengo
- America/Indiana/Petersburg
- America/Indiana/Tell_City
- America/Indiana/Vevay
- America/Indiana/Vincennes
- America/Indiana/Winamac
- America/Inuvik
- America/Iqaluit
- America/Jamaica
- America/Juneau
- America/Kentucky/Louisville
- America/Kentucky/Monticello
- America/Kralendijk
- America/La_Paz
- America/Lima
- America/Los_Angeles
- America/Lower_Princes
- America/Maceio
- America/Managua
- America/Manaus
- America/Marigot
- America/Martinique
- America/Matamoros
- America/Mazatlan
- America/Menominee
- America/Merida
- America/Metlakatla
- America/Mexico_City
- America/Miquelon
- America/Moncton
- America/Monterrey
- America/Montevideo
- America/Montserrat
- America/Nassau
- America/New_York
- America/Nipigon
- America/Nome
- America/Noronha
- America/North_Dakota/Beulah
- America/North_Dakota/Center
- America/North_Dakota/New_Salem
- America/Ojinaga
- America/Panama
- America/Pangnirtung
- America/Paramaribo
- America/Phoenix
- America/Port-au-Prince
- America/Port_of_Spain
- America/Porto_Velho
- America/Puerto_Rico
- America/Punta_Arenas
- America/Rainy_River
- America/Rankin_Inlet
- America/Recife
- America/Regina
- America/Resolute
- America/Rio_Branco
- America/Santarem
- America/Santiago
- America/Santo_Domingo
- America/Sao_Paulo
- America/Scoresbysund
- America/Sitka
- America/St_Barthelemy
- America/St_Johns
- America/St_Kitts
- America/St_Lucia
- America/St_Thomas
- America/St_Vincent
- America/Swift_Current
- America/Tegucigalpa
- America/Thule
- America/Thunder_Bay
- America/Tijuana
- America/Toronto
- America/Tortola
- America/Vancouver
- America/Whitehorse
- America/Winnipeg
- America/Yakutat
- America/Yellowknife
- Antarctica/Casey
- Antarctica/Davis
- Antarctica/DumontDUrville
- Antarctica/Macquarie
- Antarctica/Mawson
- Antarctica/McMurdo
- Antarctica/Palmer
- Antarctica/Rothera
- Antarctica/Syowa
- Antarctica/Troll
- Antarctica/Vostok
- Arctic/Longyearbyen
- Asia/Aden
- Asia/Almaty
- Asia/Amman
- Asia/Anadyr
- Asia/Aqtau
- Asia/Aqtobe
- Asia/Ashgabat
- Asia/Atyrau
- Asia/Baghdad
- Asia/Bahrain
- Asia/Baku
- Asia/Bangkok
- Asia/Barnaul
- Asia/Beirut
- Asia/Bishkek
- Asia/Brunei
- Asia/Chita
- Asia/Choibalsan
- Asia/Colombo
- Asia/Damascus
- Asia/Dhaka
- Asia/Dili
- Asia/Dubai
- Asia/Dushanbe
- Asia/Famagusta
- Asia/Gaza
- Asia/Hebron
- Asia/Ho_Chi_Minh
- Asia/Hong_Kong
- Asia/Hovd
- Asia/Irkutsk
- Asia/Jakarta
- Asia/Jayapura
- Asia/Jerusalem
- Asia/Kabul
- Asia/Kamchatka
- Asia/Karachi
- Asia/Kathmandu
- Asia/Khandyga
- Asia/Kolkata
- Asia/Krasnoyarsk
- Asia/Kuala_Lumpur
- Asia/Kuching
- Asia/Kuwait
- Asia/Macau
- Asia/Magadan
- Asia/Makassar
- Asia/Manila
- Asia/Muscat
- Asia/Nicosia
- Asia/Novokuznetsk
- Asia/Novosibirsk
- Asia/Omsk
- Asia/Oral
- Asia/Phnom_Penh
- Asia/Pontianak
- Asia/Pyongyang
- Asia/Qatar
- Asia/Qyzylorda
- Asia/Riyadh
- Asia/Sakhalin
- Asia/Samarkand
- Asia/Seoul
- Asia/Shanghai
- Asia/Singapore
- Asia/Srednekolymsk
- Asia/Taipei
- Asia/Tashkent
- Asia/Tbilisi
- Asia/Tehran
- Asia/Thimphu
- Asia/Tokyo
- Asia/Tomsk
- Asia/Ulaanbaatar
- Asia/Urumqi
- Asia/Ust-Nera
- Asia/Vientiane
- Asia/Vladivostok
- Asia/Yakutsk
- Asia/Yangon
- Asia/Yekaterinburg
- Asia/Yerevan
- Atlantic/Azores
- Atlantic/Bermuda
- Atlantic/Canary
- Atlantic/Cape_Verde
- Atlantic/Faroe
- Atlantic/Madeira
- Atlantic/Reykjavik
- Atlantic/South_Georgia
- Atlantic/St_Helena
- Atlantic/Stanley
- Australia/Adelaide
- Australia/Brisbane
- Australia/Broken_Hill
- Australia/Currie
- Australia/Darwin
- Australia/Eucla
- Australia/Hobart
- Australia/Lindeman
- Australia/Lord_Howe
- Australia/Melbourne
- Australia/Perth
- Australia/Sydney
- Europe/Amsterdam
- Europe/Andorra
- Europe/Astrakhan
- Europe/Athens
- Europe/Belgrade
- Europe/Berlin
- Europe/Bratislava
- Europe/Brussels
- Europe/Bucharest
- Europe/Budapest
- Europe/Busingen
- Europe/Chisinau
- Europe/Copenhagen
- Europe/Dublin
- Europe/Gibraltar
- Europe/Guernsey
- Europe/Helsinki
- Europe/Isle_of_Man
- Europe/Istanbul
- Europe/Jersey
- Europe/Kaliningrad
- Europe/Kiev
- Europe/Kirov
- Europe/Lisbon
- Europe/Ljubljana
- Europe/London
- Europe/Luxembourg
- Europe/Madrid
- Europe/Malta
- Europe/Mariehamn
- Europe/Minsk
- Europe/Monaco
- Europe/Moscow
- Europe/Oslo
- Europe/Paris
- Europe/Podgorica
- Europe/Prague
- Europe/Riga
- Europe/Rome
- Europe/Samara
- Europe/San_Marino
- Europe/Sarajevo
- Europe/Saratov
- Europe/Simferopol
- Europe/Skopje
- Europe/Sofia
- Europe/Stockholm
- Europe/Tallinn
- Europe/Tirane
- Europe/Ulyanovsk
- Europe/Uzhgorod
- Europe/Vaduz
- Europe/Vatican
- Europe/Vienna
- Europe/Vilnius
- Europe/Volgograd
- Europe/Warsaw
- Europe/Zagreb
- Europe/Zaporozhye
- Europe/Zurich
- Indian/Antananarivo
- Indian/Chagos
- Indian/Christmas
- Indian/Cocos
- Indian/Comoro
- Indian/Kerguelen
- Indian/Mahe
- Indian/Maldives
- Indian/Mauritius
- Indian/Mayotte
- Indian/Reunion
- Pacific/Apia
- Pacific/Auckland
- Pacific/Bougainville
- Pacific/Chatham
- Pacific/Chuuk
- Pacific/Easter
- Pacific/Efate
- Pacific/Enderbury
- Pacific/Fakaofo
- Pacific/Fiji
- Pacific/Funafuti
- Pacific/Galapagos
- Pacific/Gambier
- Pacific/Guadalcanal
- Pacific/Guam
- Pacific/Honolulu
- Pacific/Kiritimati
- Pacific/Kosrae
- Pacific/Kwajalein
- Pacific/Majuro
- Pacific/Marquesas
- Pacific/Midway
- Pacific/Nauru
- Pacific/Niue
- Pacific/Norfolk
- Pacific/Noumea
- Pacific/Pago_Pago
- Pacific/Palau
- Pacific/Pitcairn
- Pacific/Pohnpei
- Pacific/Port_Moresby
- Pacific/Rarotonga
- Pacific/Saipan
- Pacific/Tahiti
- Pacific/Tarawa
- Pacific/Tongatapu
- Pacific/Wake
- Pacific/Wallis
- UTC
タイムゾーンが違うとどうなるか?
さてこのタイムゾーンですが、もし正しく設定されていなければどのような問題が発生するのでしょうか?
date関数で取得した日時がズレる原因になる
WEBサイトやWEBサービスの制作においては、年月日を取得して表示させたり、日時によって異なる処理を行いたい場面があります。
PHPでは、date関数を使用することで現在の年月日や時刻、曜日までを簡単に取得することができます。
しかしタイムゾーンが正しく設定されていなければ、日本の現在日時が取得できないという状況が発生します。
date関数による日時が実際のものと違う原因は、サーバー側のシステムの初期設定に日本と異なるタイムゾーンが設定されているためです。
サーバーによってはあらかじめ標準の時間設定を日本にしてくれている場合もありますが、実際ずれているということは初期設定が日本になっていないということで間違いないでしょう。
ちなみにXAMPPのタイムゾーンの初期設定も日本標準時ではありません。タイムゾーンには「Europe/Berlin」(ベルリン)が設定されており、実際の日本の時刻よりも約9時間ほど遅れています。
例えばその状態でdate関数で日時を取得して見ると、日本で午後2時の場合、取得結果は午前5時となってしまいます。
date関数のおさらい
まずはじめにPHPのdate関数がどのようなものかを簡単におさらいしておきましょう。
PHPはdate関数を用いることで現在の日時を取得することができるようになっています。
フォーマットを行うことで現在の年月日だけであったり時刻だけ取得できたり、曜日や任意の日時を取得することも可能です。
日時と連動させたシステムを構築するためのプログラミングには欠かすことのできない関数です。
PHP
<?php echo date('Y/m/d H:i:s'); ?>
プレビュー
フォーマットなど、PHPのdate関数の詳しい使い方はこちら
PHPで日付を取得する方法
PHPのdate関数は当日の日付を年月日で取得したり、現在時刻を取得することが出来る関数です。date関数の使い方は簡単で、「date('フォーマット形式')」という形で記述します。フォーマットには「Y/m/d」や「Y年m月d日」などがあり、年だけ、月だけ、日にちだけ取得することも可能です...【もっと読む】
現在のタイムゾーン設定を確認する
date関数で取得した日時がズレている場合は、まず現時点でのタイムゾーンの設定がどのようになっているのか、その状況を確認してみましょう。
phpにはタイムゾーンの設定情報を取得する関数が用意されています。
date_default_timezone_getを使って取得する
date_default_timezone_getを使用すると現在のタイムゾーン設定が取得できます。echoでブラウザに表示させてみましょう。
PHP
<?php echo date_default_timezone_get(); echo date('Y/m/d H:i:s'); ?>
プレビュー
「Europe/Berlin」と出力されたこのタイムゾーン設定を日本のものに変更できれば、正しい現在時刻を取得できます。
日本のタイムゾーンは「Asia/Tokyo」です。
ここから、タイムゾーンを「Asia/Tokyo」に変更する方法を説明していきます。
PHPのタイムゾーンの設定を変更する方法
PHPのタイムゾーンの設定を変更する方法は2種類あります。
ひとつはサーバー側のPHP設定ファイルである「php.ini」を編集する方法、もうひとつは作成しているPHPファイル内で「date_default_timezone_set()」を使用して書き変える方法です。
XAMPPであればphp.iniを書き換えてしまった方が今後何度も設定し直す必要がなくなるので良いかもしれません。
レンタルサーバーなどで「php.ini」ファイルを編集できる環境にない場合は、後者の方法でタイムゾーンの設定を行ってください。
php.iniを編集してタイムゾーンを変更する方法
まずはphp.iniを書き換えてタイムゾーンの変更を行う方法をXAMPPを例にご説明します。
XAMPPについての詳しい説明はこちらをご覧ください。
XAMPPで使ってローカル環境にワードプレスをインストールする方法
XAMPPは自身のPC内に架空のサーバーを構築してくれる無料ソフトです。このページでは、XAMPPをインストールしてワードプレスを使用する流れを説明します。XAMPPを利用すれば自身のPC内でPHPやMySQLが使えるようになります。ローカル環境でワードプレスを利用したい場合はXAMPPがおすすめです...【もっと読む】
XAMPPを起動している場合はコントロールパネルから一旦停止させておいてください。
XAMPPをインストールしているフォルダを開きます。インストールの際に変更していなければCドライブ内に「XAMPP」フォルダが存在しているはずです。
その中の「php」フォルダを開きます。
その中から「php.ini」ファイルを探して、テキストエディタで開いてください。
上から順に探しても良いですが、何千行もあるので「Ctrl+F」で検索した方が簡単です。
「date.timezone=Europe/Berlin」と記述されている箇所の「Europe/Berlin」の部分を「Asia/Tokyo」に書き変えます。
ファイルを保存したら、コントロールパネルからXAMPPを起動させてdate関数による表示を確認してください。
date_default_timezone_getでタイムゾーンを確認すると「Asia/Tokyo」になっており、日時も日本時間を正しく取得できるようになりました。
XAMPP起動したままタイムゾーンを書き換えても反映されません。コントロールパネルで再起動を行ってから日付の表示が正しく変更されているか確認して下さい。
今回はXAMPPで行いましたが、実際のサーバーとなると管理している人が別だったりするなど、設定ファイルを編集できないような状況も多々考えられます。
そのような場合は次の方法でプログラム内でタイムゾーンを変更するようにしてください。
date_default_timezone_setを使用してタイムゾーンを変更する方法
プログラム内でタイムゾーンを変更する場合はdate_default_timezone_set関数を使用します。
先程から出てくる「date_default_timezone_get」と似ていますが、こちらは「date_default_timezone_set」です。
下記のように「Asia/Tokyo」を指定して変更します。
PHP
<?php date_default_timezone_set('Asia/Tokyo'); echo date_default_timezone_get(); echo date("Y/m/d H:i:s"); ?>
プレビュー
ワードプレスの場合
ワードプレスでのサイト制作においてもdate関数を使って日時を取得したい状況はあると思いますが、ワードプレスの場合は少し特殊なので注意が必要です。
まず覚えておきたいことは、ワードプレスではタイムゾーンの設定を直しても、date関数を使用するとUTCが取得される仕様になっているということです。
つまり、前述のようにサーバー側でphp.iniのタイムゾーン設定をいくら変えてもワードプレス内でdate関数を使うとUTCになってしまいます。
また、ワードプレスの一般設定にもタイムゾーン設定は存在してしますが、こちらも残念ながらdate関数には反映してくれません。
そうするとdate_default_timezone_setを使えばよいと思いますが、こちらを使うとワードプレス全体のタイムゾーンの設定を変更してしまうので、本来はUTCを基準に作られた様々なシステムに予期せぬ影響を及ぼし、不具合を引き起こしかねません。そのためdate_default_timezone_setによるタイムゾーンの変更も避けるべきです。
ではワードプレスで日付を取得したい場合にはどうすればよいのでしょうか?詳しくは別ページにて説明しておりますのでそちらをご確認下さい。
ワードプレスで日付を表示させたい場合の詳しい方法はこちら
ワードプレスで今日の日付を表示する方法
ワードプレスのphpファイル上でもdate関数は使用できるのですが、ワードプレスの仕様により時刻がずれてしまうという問題が発生します。日時を取得したい場合はdate_i18n関数を用いるようにしましょう。 使い方はdate関数と同じです...【もっと読む】
まとめ
PHPを使ってWEBサイトやWEBサービスを制作していれば、現在時刻や年月日を利用したい場面は多々あると思います。タイムゾーンをしっかり設定してdate関数で正しい日時を取得できるようにしておきましょう。