まず、データベースに日付や日時を文字列として保存しないでください。
一度もない。
わかった?
それらは常にデータベースの組み込み型date
またはdatetime
データ型に変換する必要があります。
これを怠ると、後で非常に激しく噛みつきます。たとえば、文字列として保存されている場合、特にさまざまな形式で保存されている場合に、データベースに日付順に並べ替えさせることを想像してみてください。データベースに日付がある場合、特定の日付以降またはそれ以前のエントリに基づいてクエリを実行する必要があります。そのようなことをする必要がないのであれば、そもそも日付を保存する意味があまりないので、まだ依頼されていない場合でも、それは当然のことと考えてください。後で求められるということです。したがって、常にvarcharとしてではなく、常に正しいデータ型で格納してください。
次に、対処するよう求められたフォーマットの混合。
これは狂気です。
私はPHPのstrtotime()
機能を嫌い、嫌います。それは遅く、いくつかの不幸な癖があり、一般的に過去の遺産と見なされるべきであり、使用されるべきではありません. ただし、この場合、それはあなたの助けになるかもしれません。
strtotime()
不明な形式の日付文字列を受け入れて解析し、正しいタイムスタンプを出力するように設計されています。dd-mm-yyyy
明らかに、とフォーマットの両方の存在に対処する必要がありmm-dd-yyyy
ます。これは、区切り文字を見て、2 つのうちどちらを意味するかを推測することによって行われます。
日付文字列が区切り文字としてスラッシュを使用している場合、形式はmm/dd/yyyy
. ダッシュを使用する場合は、dd-mm-yyyy
. strtotime()
これは、通常の使用でこのような痛みを伴う小さな癖の 1 つです。しかし、ここにいるのはあなたの友達です。
それが機能する方法は、実際には、質問で指定した形式とは正反対です。しかし、それはあなたを助けるのに十分なはずです。入力文字列のスラッシュとダッシュを切り替えて結果を渡すとstrtotime()
、質問で説明した方法に従って、すべての場合に正しいタイムスタンプが生成されます。
その後、それらをデータベースに正しく保存するのに十分簡単でなければなりません。
ただし、これを非常に徹底的にテストすることを強くお勧めします。そして、それがどこかで途切れても驚かない。一貫性のない形式でデータが供給されている場合、それが一貫して一貫していないことを保証する方法は実際にはありません。あなたのプログラムは基本的に、悪いデータに対して最善を尽くす必要があります。
また、入力データの品質について深刻な問題を提起する必要もあります。この状況では、確実に動作するプログラムは期待できません。それを提供している人に、それが十分ではないことを明確にしてください。不正なデータが原因でプログラムが壊れた場合、それは彼らのせいであり、あなたのせいではありません。