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(^ー^)が発生します。

input32bit64bit
string×
datetime×
array※1
timestamp×

※1 array はyearのセレクト値が1092~2037のみになる模様。[2]

32bit版のstring / datetime / timestamp はsetData()で無事死亡します。

具体的にいうと以下とかで死んでるみたいです。

170105_2038年詳細
$dateTime->getTimestamp() // will return false

170105_2038年問題

最王道(主観)の 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をいじったぞーーーー!

という猛者がいらっしゃいましたらこっそり教えてください。

[1] https://php1st.com/85/

おまけ PHPが32bitかどうかどうやってみるの

以下コマンドでどぞ。

2147483647なら32bit、9223372036854775807なら64bitです。

windows

php -r “echo PHP_INT_SIZE”;

linux

php -r ‘echo PHP_INT_SIZE’;

***

今回の話に特にオチはない。日本語検索派さんのお役に立てれば幸いです。

以上、光永でした。