Skip to content

Instantly share code, notes, and snippets.

@sasezaki
Last active December 17, 2020 04:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sasezaki/7ee980f2deeaf8333417ec431ad1e065 to your computer and use it in GitHub Desktop.
Save sasezaki/7ee980f2deeaf8333417ec431ad1e065 to your computer and use it in GitHub Desktop.
Say Kids What Time Is It in PHP ? - PHP における現在時刻を主とした日付の扱いについてのメモ

PHP における現在時刻を主とした日付の扱いについてのメモ

※ 主にステートレスなサーバーサイドリクエストを中心として

PHP本体で提供される、現在時刻取得の種類

  • date, time(), new \DateTime, new \DateTimeImmutable...
  • $_SERVER['REQUEST_TIME']

現在時刻のオーバーライド、置き換え

(PHP標準の) 時刻ライブラリに介入

  • timecop など

(PHP標準の) 時刻ライブラリを置き換え

  • Carbon, Chronos

時刻アクセス用コラボレータ

Clockライブラリ

タイムスタンプ

現在時刻取得以外としての日付ライブラリのヘルパーメソッド

比較

フォーマット・ローカライズ

TBD

TimeZone

イミュータブル

TBD

私見・悩みどころ

  • コントローラ層では、時刻アクセス用コラボレータ(※ Clockなど)を用いる
    • 静的解析で date(), new \DateTimeの呼び出しがあったら警告を出す、というツールがあってもよさそう。
  • モデル層 (「サービスクラス」など)では、基本 "現在時刻を引数で渡す"
  • 処理開始時間と対象メソッド呼び出し時でのシステム現在時刻との差異について(バッチ・ジョブキュー)
    • 仕様要求上精密に行う必要あるかを精査してハンドリング
  • エンティティのメソッド(日付比較)についても"現在時刻を引数で渡す"
  • View あるいはクライアントサイド、ブラウザ側
    • 例えば、ログインユーザが時刻期限つきで持ってるアイテム・ポイントは
  • 前述の月末・月初な罠に対しては、ミューテーションテストでのアプローチにてチェックできそう

ライブラリとの付き合い

  • 比較用のメソッドは、スタティックなヘルパーメソッドがあればよいかなと思ってる。
    • なので、Carbonの各種メソッドをヘルパー関数として提供するライブラリがあればいいんだけどたぶん見当たらない。
  • フォーマット・ローカライズ は view側の要素としてとらえてviewレイヤーで扱って来たかな
    • Twigのextensionなど

与太話的な雑感

  • やっぱ Derick の php|architect's Guide to Date and Time Programming — Derick Rethans を読べきなんですかね。。
  • Zend Framework 1の Zend_Date::now() はただただ苦しみを生みだすものだった。
    • 日付クラスができたのは、DateTime クラスが PHP 5.2までなかったからだけど。
    • Zend_Localと連携させちゃった部分がね。。。
    • おじさん(私)が "現在時刻を置き換え"なライブラリ(Carbonなど)に拒否反応を示すのはこれのためです。
  • Carbonが出回り始めた頃(2013?)、hidenorigotoさんに雑談で「あれいる?」「フォーマットのためだけのユーティリティ集が別にあればいいのにね」とか問いかけてた記憶
  • 上記のスタンスなのでnさんのサンプルコード見て、「えぇー」と思った記憶
  • "site:joind.in datetime" でググっても Derickのトークだらけだな・・・

参考

--

  • shin1x1さんが発表でCarbonのメソッドとは疎結合にしておくスタイルのはどこでしたっけ??
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment