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

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

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

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

Q&A

解決済

2回答

2434閲覧

日付に関する処理で不具合が起きています。再現が出来ません。ご指導ください。

chapp

総合スコア233

PHP

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

0グッド

0クリップ

投稿2017/04/03 07:48

お世話になります。PHPで構築しているシステムがあるのですが、処理実行時、操作した際の日付で変数に代入する内容を変えている箇所があります。

年会費の振込確認が出来た際に、会員向けにThanksメールを送りますが、26日を1つの境としており、
26日までに振り込んでいただければ、会費は当月から12カ月とし、
26日以降の振込であれば、翌月から12カ月の期間を会費に充当されるため、
開始月と最終月を以下のソースコードで求めています。

以下がその実際のコードで、26日を境に、$year_start_month(開始月)、$year_last_month(最終月)にそれぞれ必要データを代入していますが、稀に処理を月末に行うと、開始月が翌々月になることが確認出来ることがあるのですが、どこかソースの記述に誤った箇所はありますでしょうか?

ご指導いただければ幸いです。
宜しくお願い致します。

※稀と表現したのも、毎回ではないのです・・・

$today = date("d"); if($today >= 26){ $this_month = date("n", strtotime("+1 month")); $year_start_month = date("Y/n", strtotime("+1 month")); $year_last_month = date("Y/n", strtotime("+12 month")); } else{ $year_start_month = date("Y/n"); $year_last_month = date("Y/n", strtotime("+11 month")); } $kikan = $year_start_month."-".$year_last_month;

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/04/03 07:51

「開始月が翌々月になる」事例はどのくらい押さえられていますか? わかっている分だけでもいいので追記してください。
退会済みユーザー

退会済みユーザー

2017/04/03 07:52

このコードだと、25日までと26日以降で条件分けしているように見えて、質問文にある仕様とズレているように感じます。
07JP27

2017/04/03 07:54 編集

稀にとありますが、その際の各変数の値はどのように入っているか確認はされましたか?またif文のどちらに入っても発生するのか、どちらか片方でしか発生しないのかなど、もう少し問題の切り分けはできないでしょうか。
guest

回答2

0

ベストアンサー

翌月に対応する日がないと(1/29~31、3/31など)、strtoime('+1 month')で、その次の月まで日付が進んでしまいます(3v4lでの動作結果)。

投稿2017/04/03 07:57

編集2017/04/03 07:58
maisumakun

総合スコア145184

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

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

chapp

2017/04/03 08:17

maisumakun様 貴重なアドバイスをありがとうございます。 翌月に対応する日がないと・・・なるほど、納得しました! この場合、1月、3月、5月、7月、8月、10月、12月が月末に処理を行うと、翌月にその対応する日がないことになりますが、やはり月毎にif分などで分けることになるのでしょうか?もっとスマートな記述はあるのでしょうか? ご親切にサイト( https://3v4l.org/nllke )も教えて頂いておりますが、質問時に提示したソースへの応用が分からないため、今一度、アドバイスのほど頂戴出来れば幸いです。 宜しくお願い致します。
maisumakun

2017/04/03 08:27

3v4lで示したものは、実際に「1月31日に+1 monthしてみた動作」の例です。 結局、日付ごとの分岐は必須となるでしょうし、翌月にずらす部分を関数化した方がいいかもしれません。
chapp

2017/04/03 08:36

maisumakun様 ご親切な追加のコメントをありがとうございます。 この度は貴重なアドバイスにより解決いたしました。ありがとうございました。
guest

0

サーバーのタイムゾーン設定はどうなっているでしょうか。
date()ってあくまでサーバーローカルの日付なので、
日本標準時と異なっていると月末日はサーバーの方で既に翌月に進んでいる可能性があります。

すみません、maisumakunさんの回答の方がより正しい状況だと思います。
PHPで、先月、翌月などを扱うときの注意 - bushimichiの日記
PHP strtotime関数でハマった!(翌月の表現の処理) - Web Tech Log by 1KB
日付の日成分を1にしてから処理する、というのが正しいようです。

投稿2017/04/03 07:57

編集2017/04/03 08:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chapp

2017/04/03 08:08

m6u様 早速のコメントありがとうございます。実際に実行された際の日時も確認いたしましたが、不具合の原因となる状況は確認できませんでした。 ご親切な書込み、感謝しています。
chapp

2017/04/03 08:27

m6u様 ご親切な追加情報、ありがとうございます。 教えてくださった情報で、うまく動作するまで確認いたしました。 ありがとうございます!
chapp

2017/04/03 08:33

m6u様 度々の投稿、失礼します。 この度の質問への回答、ベストアンサーの判断がとても悩ましいのですが、maisumakun様のコメントが、解決に向けた内容と判断してベストアンサーといたしますが、m6u様のご親切な回答が、うまく動作するまで出来たこと、感謝していますこと書き残します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問