PHPでタイムゾーンを操作する

プロジェクトが限られた数の消費者に縛られるのをやめ、そのアプリケーションの地域が拡大するやいなや、タイムゾーンの使用に関する問題が生じます。 私が有名なインターネット会社で働いていたとき、仕事にタイムゾーンを導入すること(統計表示インターフェイスと分析プログラムの両方)はかなり深刻なステップでした。

さらに翻訳:-)
投稿者:Derick Rethans
URL: www.derickrethans.nl/talks.php

内容


タイムゾーンの問題
時間変換の問題
時間帯と「矢印の翻訳」のその他の問題
タイムゾーンの名前の問題
さらに、ゾーン名はオペレーティングシステムによって異なる場合があります。

日付と時刻を提示する際の問題
日時を操作するためのphp 4およびphp 5の関数
日付制限
PHP 5.1以降での日付の改善
PHP 5.1以降のデータ形式
アメリカ形式: 9/11; 4:午後8時; 12/22/78; 午前8:51:00
組み合わせ形式:土、2004年4月24日21:48:40 +0200; 2001-11-29T13:20:01.123-05:00
記述形式:明日; 4か月前。 先週の土曜日。 +20日2時間
テキスト形式: 1978年12月22日。 1978年12月22日
すべてのISO 8601形式: 1978/12/22; 13:03:12.45678; 13:03:12.45678 +0100; 15:57-8; 1978-12-22; 15:57:41 pdt; 13:03:12.45678 CEST; 231431 CEST; 70-4-25; 13:03 CEST; 04:05 -0930; 23:41F
データベース形式: 1999-Jan-08; 1999.238
PHP 5.1以降でのタイムゾーンのサポート
タイムゾーンのサポート。 使い方は?
タイムゾーン情報を変更する
日付の解析(過去)
strtotime関数を使用して日付と時刻の情報を含む文字列を解析する
$ ts = strtotime( "2005-07-11 22:16:50 CEST");

タイムスタンプ初期化の使用
$ date = strtotime( "2005-07-11 22:16:50 CEST");
$ ts = strtotime( "来週"、$日付);

戻り値は32ビット整数です。
日付の解析(将来)
date_create関数を使用した日付と時刻の情報を含む文字列の解析
"$ Ts = date_create(" 1978-12-22 09:15:50 ");"
または、DateTime型のオブジェクトを作成できます
$ ts =新しいDateTime( "1978-12-22 09:15:50");

これらの関数は32ビット整数を使用せず、DateTimeクラスのオブジェクトを返します。これは、64ビット整数のラッパーであり、次の構造を使用する必要があります。
$ ts =新しいDateTime( "1978-12-22 09:15:50");
echo $ ts-> format( 'U');
date_parse関数を使用して文字列を解析する
$ date = "22apr2006 8:36:14.43#^ Europe / Oslo CEST";
$ t = date_parse($ date);
echo $ t ['year'] .'- '。$ t [' month '] .'-'。$ t ['date']。 ' ';
echo $ t ['hour']。 ':'。$ t ['minute']。 ':'。$ t ['second']。 ' ';
echo $ t ['tz_id']。 "\ n";

日付形式
date_default_timezone_set( "ヨーロッパ/オスロ");
$ ts = date_create( "1979-12-31 09:15");
echo date_format($ ts、 "D Ymd H:i:s-\ I \ S \ O \ W / \ Y:W / o");

日付関数でサポートされているすべてのフォーマット修飾子もサポートされています。
定義済みの形式:
date_default_timezone_set( "ヨーロッパ/オスロ");
$ ts = date_create( "2005年12月22日15:41");
echo date_format($ ts、DATE_ISO8601);
echo date_format($ ts、DateTime :: RFC1036);
echo date_format($ ts、DATE_RSS);

php6のロケール
date_default_timezone_set( "ヨーロッパ/オスロ");
$ ts = date_create( "2005年12月22日15:41");
$ locales = array( 'en_US'、 'fr_CA'、 'nb_NO'、 'ru_RU'、 'ar_SA'、 'ja_JP');
foreach($ロケールを$ロケールとして)
{
locale_set_default($ロケール);
echo date_format_locale($ ts、DATE_RFC2822)。 "\ n";
}

日付と時刻の更新
$ date = new DateTime( 'now');
echo $ date-> format(DateTime :: ISO8601)。 "\ n";
$ date-> setTime(15,0,7);
echo $ date-> format(DateTime :: ISO8601)。 "\ n";
$ date-> setDate(2006,12,22);
echo $ date-> format(DateTime :: ISO8601)。 "\ n";
$ date-> setIsoDate(2006,45,2);
echo $ date-> format(DateTime :: ISO8601)。 "\ n";

日付と時刻を変更する
date_default_timezone_set( "ヨーロッパ/オスロ");
$ date = new DateTime( 'now');
echo $ ts-> format(DATE_RFC2822)。 "\ n";
$ ts-> modify( "+ 2 days");
echo $ ts-> format(DATE_RFC2822)。 "\ n";
$ ts-> modify( "5か月目");
echo $ ts-> format(DATE_RFC2822)。 "\ n";
$ ts-> modify( "Friday +3 weeks");
echo $ ts-> format(DATE_RFC2822)。 "\ n";
$ ts-> modify( "next friday");
echo $ ts-> format(DATE_RFC2822)。 "\ n";

タイムゾーンを使用する
日付の解析時にタイムゾーンの省略名を設定する
$ ts = date_create( "1978-12-22 09:15 CEST");

タイムゾーンの略語の使用は推奨されていません。デフォルトのタイムゾーンまたは完全なタイムゾーン識別子を設定する必要があります
$ ts = date_create( "1978-12-22 09:15 Europe / Oslo")

デフォルトのタイムゾーン
デフォルトのタイムゾーンの設定
date_default_timezone_set( "ヨーロッパ/オスロ");
$ ts = date_create( "1978-12-22 09:15");
echo $ ts-> format( 'e');

デフォルトのタイムゾーンを取得する
echo date_default_timezone_get();

デフォルトのタイムゾーンは次のように決定されます
タイムゾーンの使用。 オブジェクトのタイムゾーン
タイムゾーンを作成
$ tz = timezone_open( 'アジア/シンガポール');

文字列表現の解析時にタイムゾーンを使用する
$ tz = timezone_open( '太平洋/ホノルル');
$ ts = date_create( "1978-12-22 09:15 '、$ tz);

関数の引数としてタイムゾーンを使用しても、解析された文字列で指定されたタイムゾーンと重複しません
$ tz =新しいDateTimeZone( '太平洋/ホノルル');
$ ts1 =新しいDateTime( '1978-12-22 09:15 CEST'、$ tz);
$ ts2 =新しいDateTime( '1978-12-22 09:15 Europe / Amsterdam'、$ tz);
echo $ ts2-> format(DateTime :: RFC2822);

タイムゾーンの名前を取得する
$ tz = timezone_open( 'アジア/シンガポール');
echo timezone_name_get($ tz);

$ tz = timezone_open( 'CEST');
echo timezone_name_get($ tz);

グリニッジから現在のオフセットを取得する
$ tz =新しいDateTimeZone(»ヨーロッパ/アムステルダム ");
$ d =新しいDateTime( "2005-01-22 09:15");
echo $ tz-> getOffset($ d);
$ d-> modify( "+ 6 months");
echo $ tz-> getOffset($ d);

タイムゾーンの使用。 タイムゾーンの変更
文字列表現の解析時にタイムゾーンを使用する
$ tz1 = timezone_open( 'Pacisic / Honolulu');
$ tz2 = timezone_open( 'Europe / Amsterdam');
$ tz3 = timezone_open( 'オーストラリア/メルボルン');

$ ts = date_create( "1978-12-22 09:15"、$ tz1);
echo $ ts-> getTimezone()-> getName()。 ':'。$ ts-> format(DATE_RFC822)。 "\ n";
$ ts-> setTimezone($ tz2);
echo $ ts-> getTimezone()-> getName()。 ':'。$ ts-> format(DATE_RFC822)。 "\ n";
$ ts-> setTimezone($ tz3);
echo $ ts-> getTimezone()-> getName()。 ':'。$ ts-> format(DATE_RFC822)。 "\ n";

時間変換テーブル
$ tz = timezone_open( 'Europe / Amsterdam');
$ trs = timezone_transitions_get($ tz); //または$ trs = $ tz-> getTransitions();
foreach($ tsとしての$ trs)
printf( "%20s%7d%d%s \ n"、$ tr ['time']、$ tr ['offset']、$ tr ['isdst']、$ tr ['abbr']);

略語と識別子
サポートされているすべての識別子の取得
$ ids = timezone_identifiers_list();
echo "識別子の数:" .count($ ids)。 "\ n";
echo implode( "、"、array_slice($ ids、0、5)).'... '。implode( "、"、array_slice($ ids、-5));

サポートされているすべての略語の取得
$ abbrs = timezone_abbreviations_list();
foreach($ abrs as $ abbr => $ ids)
foreach($ idを$ idとして)
printf( "%-6s%6d%d%s \ n"、strtoupper($ abbr)、$ id ['offset']、$ id ['dst']、$ id ['timezone_id']);

矢印の翻訳。 次はいつですか?
date_default_timezone_set( "アメリカ/ New_york");
$ tz = new DateTimeZone( "アメリカ/ New_york");
foreach(timezone_transitions_get($ tz)as $ tr)
if($ tr ['ts']> time())break;
$ d =新しいDateTime( "@ {$ tr ['ts']}");
printf( "タイムゾーン%sは%sで%sに切り替わります。\ n新しいGMTオフセットは次のようになります。%d(%s)\ n"、$ tz-> getName()、$ tr ['isdst']? " DST ":"標準時 "、$ d->形式( 'd MY @ H:i T')、$ tr ['offset']、$ tr ['abbr']);

この機能が表示されるとき
PHP 5.1では、フラグCFLAGS = -DEXPERIMENTAL_DATE_SUPPORT = 1を使用してコンパイルする必要があります
PHP 5.2以降では、デフォルトで

ここに追加公開

Source: https://habr.com/ru/post/J19838/


All Articles