Webプロジェクトの開発時にユーザーのタイムゾーンを考慮するタスクが発生すると、そのたびにソリューションを再発明する必要があるように思われます。 この問題を解決した私に知られている多くのプロジェクトの中で、単純で、アーキテクチャ全体に対して透過的で、普遍的と言える単一のソリューションを思い出しません。
しかし、ほんの数行のコードが必要なだけで、コードの残りの部分が、データを別のタイムゾーンでクライアントに送信する必要があること、およびクライアントから受信したデータをサーバーのタイムゾーンとは異なるタイムゾーンで示すことができない場合はどうでしょうか? この問題や他の多くの問題を解決するために、今日は、PHP用の簡潔で機能的なライブラリについて説明します。
だから、会う-Dater 、およびその主な機能:
- フォーマットバインディング
- テキストとフォーマットのローカライズ
- 書式設定オプションのリストの拡張
- タイムゾーン自動検出
- タイムゾーンに基づいた時間変換
- タイムゾーンを考慮した$ _GET、$ _POST、$ _REQUESTへの時間の自動変換
- データを送信するためのテンプレートのタイムゾーンの自動変換
デザート用のユーザーのタイムゾーンの自動検出と処理のために、約束されたコード行を残しますが、ここでは、簡単に例を挙げて、Daterの主な機能について説明します。
フォーマットバインディング
プロジェクトに使用される一連の形式を標準化し、名前で操作できます。
$dater = new Dater\Dater(new Dater\Locale\En()); $dater->format(time(), 'd/m/Y'); // 2013/03/14 $dater->addFormat('slashedDate', 'd/m/Y'); $dater->format(time(), 'slashedDate'); // 2013/03/14 $dater->slashedDate(time()); // 2013/03/14
書式設定オプションの拡張
日付()からのすべてのフォーマットオプションが使用可能です 。これは、オーバーライドおよび拡張することもできます 。
$dater->addFormatOption('ago', function (DateTime $datetime) { return floor((time() - $datetime->getTimestamp()) / 86400) . ' days ago'; }); $dater->format(time() - 60*60*24*7, 'd FY, ago'); // 14 March 2013, 7 days ago
ロケールのサポート
$dater->setLocale(new Dater\Locale\En()); echo $dater->date(); // 03/21/2013 echo $dater->now('j F Y'); // 21 March 2013 $dater->setLocale(Dater\Dater::getLocaleByCode('ru')); echo $dater->date(); // 21.03.2013 echo $dater->now('j F Y'); // 21 2013
ロケールに基づいたサーバーおよびユーザー形式の標準メソッド
echo $dater->date(); // 03/21/2013 (client timezone, depends on locale) echo $dater->time(); // 5:41 AM (client timezone, depends on locale) echo $dater->datetime(); // 03/21/2013 5:41 (client timezone, depends on locale) echo $dater->isoDate(); // 2013-03-21 (client timezone) echo $dater->isoTime(); // 05:41:28 (client timezone) echo $dater->isoDatetime(); // 2013-03-21 05:41:28 (client timezone) echo $dater->serverDate(); // 2013-03-21 (server timezone) echo $dater->serverTime(); // 09:41:28 (server timezone) echo $dater->serverDatetime(); // 2013-03-21 09:41:28 (server timezone)
タイムゾーンに基づいた時間/日付の変換
$dater->setServerTimezone('Europe/Moscow'); $dater->setClientTimezone('Europe/London'); echo $dater->serverDatetime(); // 2013-03-21 08:18:06 echo $dater->isoDatetime(); // 2013-03-21 04:18:06 echo $dater->time(); // 04:18
$dater->setServerTimezone('Europe/Moscow');
呼び出すとき、言及する価値があり
$dater->setServerTimezone('Europe/Moscow');
date()関数とDateTimeクラスは、新しく設定されたタイムゾーンで時刻を返します。 これを無効にするには、2番目のパラメーターにfalseを渡します。
そして最後に約束された
クライアントのタイムゾーンを自動的に決定し、クライアントの現在の日時を表示できるコード:
グローバル初期化スクリプトのヘッダー内
$dater = new Dater\Dater(new Dater\Locale\Ru(), 'Europe/Moscow'); $timezoneDetector = new Dater\TimezoneDetector(); $dater->setClientTimezone($timezoneDetector->getClientTimezone()); $dataHandler = new Dater\DataHandler($dater); $dataHandler->enableOutputTimezoneHandler(); $dataHandler->convertRequestDataToServerTimezone();
メインテンプレート内
<html> <head> <?= $timezoneDetector->getHtmlJsCode() ?> </head> </html>
これで、送信されたデータのすべての行YYYY-MM-DD HH:MM:SSは、YYYY-MM-DD HH:MM:クライアントの自動的に決定されたタイムゾーンのSSに置き換えられます。 特定の形式で日時を表示する必要がある場合は、YYYY-MM-DD HH:MM:SS [md]またはYYYY-MM-DD HH:MM:SS [date]を追加します。dateはDaterでビニングされた形式です 。 タイムスタンプ形式を出力およびフォーマットすることもできます:1363853607 [dmY]。
たとえば、次のデータ
<html> <body> Timestamp format: 1363238564 ( ) Timestamp format: 1363238564[Y/m/d] Timestamp format: 1363238564[datetime] Server datetime format: 2013-03-14 09:22:44[Y/m/d] Server datetime format: 2013-03-14 09:22:44[time] Server datetime format: 2013-03-14 09:22:44 </body> </html>
に自動的に変換されます
<html> <body> Timestamp format: 1363238564 ( ) Timestamp format: 2013/03/14 Timestamp format: 14.03.2013 07:22 Server datetime format: 2013/03/14 Server datetime format: 07:22 Server datetime format: 2013-03-14 07:22:44 </body> </html>
同時に、
$dataHandler->convertRequestDataToServerTimezone();
すべてのYYYY-MM-DD HH:MM:クライアントからのSSデータをYYYY-MM-DD HH:MM:SSサーバーのタイムゾーンに変換します。 したがって、サーバーは、クライアントが別のタイムゾーンで日時を送受信することを知ることはありません。
これは、タイムゾーンを処理するための少し極端なオプションであることを認識する価値があります。 より普遍的で伝統的なソリューションは、
$dataHandler->enableOutputTimezoneHandler();
使用を放棄すること
$dataHandler->enableOutputTimezoneHandler();
適切な書式設定メソッドを呼び出して、各日時の挿入を単純にフレーミングします。 たとえば、
<?= $dater->date($datetimeOrTimestamp) ?>
ます。
プロジェクトについて
私はこのライブラリの著者であることを正直に認めており、批判やファイナライズの支援に非常に感謝しています。 ソースは無料のBSDライセンスの下でGitHubにアップロードされ 、希望どおりに使用および配布されます。
誰かがまだ役に立つといいのですが:)
UPD一般的な需要により、ライブラリはPSR-0に従ってネームスペースを使用してリファクタリングされました。 前のバージョンは別のブランチに保存され、Composerから
"dater/dater":"1.*@dev"
として入手できます。