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以降では、デフォルトで



ここに追加公開



All Articles