多くの人が既にお気に入りのディストリビューションにtzdata更新プログラムをインストールしており、2014年10月26日の午前3時にすべてを感じることができる
世界の
終わりを楽しみにしています。
しかし、PHPで記述してSymfony Formsを使用する場合、またはphp-intlを使用する場合は、すべて大丈夫ですか?
私の答えはノーです。
簡単に確認できます:
<?php $dateIn = '27.10.2014'; $tz = 'Europe/Moscow'; date_default_timezone_set($tz); $intlDateFormatter = new \IntlDateFormatter('ru_RU', 2, -1, $tz, 1, 'dd.MM.yyyy'); $timestamp = $intlDateFormatter->parse($dateIn); var_dump($intlDateFormatter->format($timestamp)); var_dump(date('dmY', $timestamp));
Debian Wheezy、CentOS 6では、tzdataの更新後、このコードは次を出力します。
string(16) "27.10.2014" string(16) "26.10.2014"
これは、
icuライブラリには独自のタイムゾーンデータベースがあり(これは一般的なアクティビティです。たとえば、php、java、chrome、および他のソフトウェアのキャリッジも実行します)、unixタイムスタンプの日付を再計算すると、4時間かかり、php date関数は追加するだけです3、また、日付を入力するフィールドしかない場合は、時間を削除した後、入力した日付から1日少なくなります。
状況は、このデータがlibicudataライブラリーの形式で保管されているという事実により悪化しているため、ソースからicuを収集する準備をしてください。
その後、すべてのアクションは、CentOS 6.5 + remi + libicu-lastを実行する別のVMで実行されます。
パッケージのバージョンに応じて、icuバージョン-50.1.2(
icu Webサイトのソース )を判別し、ここからすべての* .resファイルをダウンロードします。ここで(リンク内)
2014i-tzdataのバージョン。
44-libicuのバージョン(44以上)
le-リトルエンディアン(mipsアームなどがある場合は、別のリソースセットが必要になる場合があります)。
tar -zxf icu4c-50_1_2-src.tgz cd icu/source mkdir bin ./configure
原則として、ここで停止し、アセンブリ後にシステムの/ usr / lib64 /のライブラリを新しいバージョンの./lib/libicudata.so.50.1.2に置き換えます。
パッケージをまとめました:
yum install rpmrebuild rpmrebuild -e -p --notest-install libicu-last-50.1.2-10.el6.remi.x86_64.rpm
行ごと
BuildRoot: /root/.tmp/rpmrebuild.42406/work/root
アンパックされたパッケージファイルの場所を特定し、libicudataを最新バージョンに置き換えます。バージョンを変更しなかったため、結果のパッケージ(ビルド後にrpmbuildがフルパスを書き込む)を--forceスイッチでインストールできます。
ご清聴ありがとうございました!
UPD: Ubuntuユーザー(Trusty | Precise)は、
ranzheハブ
ユーザーppaで既製のパッケージを
取得できます。