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

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

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

dateは、date型や日付に関する関数や処理についてのタグです

PHP

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

Q&A

解決済

3回答

1023閲覧

date関数の返り値の型がおかしい。なぜこのような挙動になるのか。

aaiau

総合スコア11

date

dateは、date型や日付に関する関数や処理についてのタグです

PHP

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

0グッド

0クリップ

投稿2019/08/09 03:31

編集2019/08/09 03:43

実装の中で現在の時間に1時間を加算した日時を文字列で受け取る(時刻が12時なら'2019/08/09 13:00:00'といった具合)処理を作成していたのですが、以下のように実装したところ、想定していない値が返ってきました。

php

1// 2019/08/09 02:10に実行した場合、'2019/08/09 03:00:00'という値が返ってくることを期待している 2$date = date('Y/m/d ') . date('H') +1 . ':00:00'; 3 4var_dump($date); // 結果は string(10) "2020:00:00" となる 5 6// +1を加算しない場合、問題は発生しない 7$date = date('Y/m/d ') . date('H') . ':00:00'; 8var_dump($date); // 結果は string(19) "2019/08/09 03:00:00" となる 9 10// PHPの特性上、以下のように異なるデータ型で加算するよう記述してもintとして扱ってくれる 11$num = (string)'02' + (int)1; 12var_dump( $num ); // 結果は int(3) となる 13

公式のマニュアルを見てもvar_dumpを使った場合でも、date関数の返り値はstringであると記載されているので、date('H')の返り値に+1を加算しても何ら変わらないと思うのですが、内部的にdate型的な扱いをしているのでしょうか?

上記の処理に関しては社内業務用に適当に作ったものなので、『この処理だと24時に+1したら…なのでこの方が…』というアドバイスが欲しいのではなく、単純にこの挙動が気になったので、知っている方いましたら、解説いただけるとありがたいです。
よろしくお願いします。

追記
すみません。バージョンについて記載していませんでしたが、PHP 5.3.3です。

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

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

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

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

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

m.ts10806

2019/08/09 03:41

通常だと(PHP7環境)エラーになるコードでは。 PHP Notice: A non well formed numeric value encountered
aaiau

2019/08/09 04:06 編集

なるほど、noticeに関しては見ていませんでした… ありがとうございます。 $num = (string)'02' + (int)1; 上記の演算の場合、noticeは発生しないところを見ると、やはりPHPの内部では、date関数の返り値とstring型は別物として扱っているということなんでしょうかね
m.ts10806

2019/08/09 04:11

PHPは結構型については緩いです(7で割としっかりと型付けができるようにはなりましたけどあくまでそういう実装をする必要がある。 ただNoticeについてはあくまで計算式と文字列連結をしようとしているところで起きるものです。 $num = "2014/11".(string)'02' + (int)1; ちなみにこれはSyntaxです $num = (string)'02' + (int)1.""; 「計算式」としてきちんと行うには既に回答が出ているようにそこだけ()で囲ってあげる必要があります。 $num = "2014/11".((string)'02' + (int)1); $num = ((string)'02' + (int)1)."";
guest

回答3

0

シンプルに考えてください
式を左から順に評価していだけです

PHP

1$temp1=date('Y/m/d '); 2$temp2=$temp1 . date('H'); 3$temp3=$temp2 +1; 4$temp4=$temp3.':00:00'; 5 6var_dump([$temp1,$temp2,$temp3,$temp4]);

投稿2019/08/09 03:38

yambejp

総合スコア114769

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

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

0

ベストアンサー

演算子の優先順位上、date('Y/m/d ') . date('H') +1(date('Y/m/d ') . date('H')) + 1と解釈され、前半が数値変換されてしまっています。

カッコで括ってdate('Y/m/d ') . (date('H') +1)のようにしておきましょう。

投稿2019/08/09 03:47

maisumakun

総合スコア145183

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

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

aaiau

2019/08/09 04:09

なるほど!! 確かに! 全くそのとおりですね! 演算の優先順によるものだったとは… 返り値の問題とか言ってた自分が恥ずかしいです。
guest

0

出先なので確認できませんが、おそらく…

date('Y/m/d ') . date('H') +1

ここで"2019/08/09 03"という文字列に+1しようとする

文字列が数値に変換されるが、"/"は数値じゃないので、その手前の2019までが数値になる

2019+1=2020

という流れじゃないかと。
date('H') +1を()で囲んでみては。

投稿2019/08/09 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問