質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

691閲覧

date("Y")の値を正しく返してくれない

SugiuraY

総合スコア317

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/01/02 14:46

下記のようにdate()を利用して特定に日付を返すget_ye()関数を定義しているのですが、$test_2の引数を渡すと"Y"に関して、1970年のタイムスタンプの基準点を返してきます。

(環境)PHP:7.4.1

php

1<?php 2 function get_ye($dat){ 3 $mm = date('m', strtotime($dat)); 4 if ($mm==="01"||$mm==="02"||$mm==="03"||$mm==="04"||$mm==="05") { 5 $target = date('Y', strtotime($dat))."-05-31"; 6 }elseif ($mm==="06"||$mm==="07"||$mm==="08"||$mm==="09"||$mm==="10"||$mm==="11") { 7 $target = date('Y', strtotime($dat))."-11-30"; 8 }elseif ($mm==="12"){ 9 $target = (date('Y', strtotime($dat))+1)."-05-31"; 10 } 11 return $target; 12} 13?> 14 15<?php 16$test_1 = "2031-02-31"; 17$test_2 = "2050-04-15"; 18 19get_ye($test_1)// "2031-05-31" //正しい 20get_ye($test_2)// "1970-05-31" //正しくない 21?>

$test_1と同じ条件でやっているのに、不思議に思い他の環境で試し直接以下のコードを実行してみたところ、やはり適切な日付である"2050-05-31"を返してくれませんでした。

php

1 $mm = date('m', strtotime("2050-04-15")); 2 if ($mm==="01"||$mm==="02"||$mm==="03"||$mm==="04"||$mm==="05") { 3 $target = date('Y', strtotime("2050-04-15"))."-05-31"; 4 }elseif ($mm==="06"||$mm==="07"||$mm==="08"||$mm==="09"||$mm==="10"||$mm==="11") { 5 $target = date('Y', strtotime("2050-04-15"))."-11-30"; 6 }elseif ($mm==="12"){ 7 $target = (date('Y', strtotime("2050-04-15"))+1)."-05-31"; 8 } 9 echo $target; // "1970-05-31" //正しくない

他方で、オンラインphp環境のpaiza.ioでこれを実行すると期待する"2050-05-31"を返してくれます。

この問題を切り分けることができないのですが、php.ini等の設定の問題なのでしょうか?原因が特定できず、ご質問をさせて頂きました。

宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

お使いのPHPが32ビット版なのではないでしょうか。

注意:

タイムスタンプの有効な範囲は、通常、Fri, 13 Dec 1901 20:45:54 UTC から Tue, 19 Jan 2038 03:14:07 UTC までです (これらは、32 ビット符号付整数の最大及び最小に一致します)。

64 ビット版の PHP では、タイムスタンプの有効範囲は事実上無制限です。 というのも、64 ビットでは過去側も未来側も約 2930 億年を表せるからです。

PHP: strtotime - Manual

投稿2022/01/02 15:04

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2022/01/02 15:12

コメントお寄せいただきありがとうございます。ご指摘の通りでした。2038というキーワードまでたどり着いて、気が付くことができました。一つ勉強になりました。
guest

0

自己解決

以下のようにループで回してみた結果、2038年以降は私のphpでは適切に返してくれないみたいです。

php

1$test3 ="2037-04-15";// "2037-05-31" 2$test4 ="2038-04-15";// "1970-05-31" 3 4for ($i=2020; $i <2100 ; $i++) { 5 $test = $i."-04-15"; 6 $mm = date('m', strtotime($test)); 7 if ($mm==="01"||$mm==="02"||$mm==="03"||$mm==="04"||$mm==="05") { 8 $target = date('Y', strtotime($test))."-05-31"; 9 }elseif ($mm==="06"||$mm==="07"||$mm==="08"||$mm==="09"||$mm==="10"||$mm==="11") { 10 $target = date('Y', strtotime($test))."-11-30"; 11 }elseif ($mm==="12"){ 12 $target = (date('Y', strtotime($test))+1)."-05-31"; 13 } 14 echo $target."<br>"; 15}

そこで、検索した結果2038年問題という論点にぶつかりました、結果DateTime型を使えば回避できそうなのですが、解決に至ることができました。

投稿2022/01/02 15:02

SugiuraY

総合スコア317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問