SymfonyのDateTypeに2038年問題でやられた話(ver2.8.*)
結論:いや、仕様です。
こんにちは、光永です。
ごぶさたの技術ブログですね! 遅くなりました。
下書きのまま記事が寝かされてたとかは内緒です
掲題の件でやられてしまったので口惜しさ紛れにブログ記事を書きました。
結構情報がバラバラだったので少しでも役に立てば幸い。
2038年問題とは?
2038年1月19日3時14分7秒を過ぎるとPCなどに不具合が起きるかも、という問題。
32bit日付の対応限界が2038年のため。[1]
PHPにおいては32bitバージョンがこの問題の影響をもろに食らう。[2]
なお、PHPを64bitにすると解消される。
[1] https://ja.wikipedia.org/wiki/2038年問題
[2] http://stackoverflow.com/questions/3953333/maximum-time-php
Symfony1系をお使いの方は
弊社過去記事[1]をご参照下され!
[1] https://www.kuzilla.co.jp/20100420symfony
SymfonyのForm
SymfonyのDateTypeフォームでは以下[1]のような対応。
なお、2038年問題以降の日付が、DateTypeのoptions.inputによってどのように対応されているか?の表です。
×になっていると、32bit版で使用した途端Exception(^ー^)が発生します。
input | 32bit | 64bit |
---|---|---|
string | × | ○ |
datetime | × | ○ |
array | ※1 | ○ |
timestamp | × | ○ |
※1 array はyearのセレクト値が1092~2037のみになる模様。[2]
32bit版のstring / datetime / timestamp はsetData()で無事死亡します。
具体的にいうと以下とかで死んでるみたいです。
$dateTime->getTimestamp() // will return false
最王道(主観)の widget = single_text & input = datetime が息してない。
[1] http://symfony.com/doc/current/reference/forms/types/date.html#input
[2] https://github.com/symfony/symfony/issues/5227
で?
PHPを64bitにするっきゃない???
上記でgetTimestampしてるところをなんとか[1]すれば、とりあえず治りそうな気もしないでもないのですが……?
自力でCoreをいじったぞーーーー!
という猛者がいらっしゃいましたらこっそり教えてください。
おまけ PHPが32bitかどうかどうやってみるの
以下コマンドでどぞ。
2147483647
なら32bit、9223372036854775807
なら64bitです。
windows
linux
***
今回の話に特にオチはない。日本語検索派さんのお役に立てれば幸いです。
以上、光永でした。