※ 主にステートレスなサーバーサイドリクエストを中心として
- date, time(), new \DateTime, new \DateTimeImmutable...
- $_SERVER['REQUEST_TIME']
- timecop など
- Carbon, Chronos
- lcobucci/clock: Yet another clock abstraction
- ver 2.0.0 では PHPのバージョンが
^7.4 || ^8.0
- たぶん infectionあたりとの兼ね合いで
- なので kreait/clock-php: A PHP 7.0 compatible clock abstraction もある
- ver 2.0.0 では PHPのバージョンが
- Clockライブラリ系は軽く調べたところ
$_SERVER['REQUEST_TIME']
や PSR-7 からのファクトリとかはないっすね
- Doctrineだと gedmo/doctrine-extensions の Timestampableとか
- 内部的にはどういう仕組みだっけ?
- 月末月初としての Carbonの NoOverflow といったメソッドは確かに有用かもも
- 月の最後の日をPHPで簡単に知る方法 - Blog::koyhoge::Tech
- 日付オブジェクトのメソッド vs
strtotime
の豊富すぎる記法
TBD
- Working with DateTime Instances - Doctrine Object Relational Mapper (ORM)
-
データベースの日時型にタイムゾーンは伴うべきか、という問に対しては、伴うべき、で、かつ、常にUTCで格納すべき、という立場です
— Moriyoshi Koizumi (@moriyoshit) November 7, 2020 - 『APIデザインケーススタディ――Rubyの実例から学ぶ。問題に即したデザインと普遍の考え方』
Column 一方,PHPはタイムゾーンデータベースを同梱した
- PHP には date.timezone ini オプション と date_default_timezone_get()がある!...
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のメソッドとは疎結合にしておくスタイルのはどこでしたっけ??