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

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

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

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

Q&A

解決済

2回答

1630閲覧

1年後までのカレンダーを作成をしたい

ash05

総合スコア6

PHP

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

0グッド

0クリップ

投稿2020/02/11 13:30

前提・実現したいこと

1年後までのカレンダーを作成

発生している問題・エラーメッセージ

今日の日付だけが365個表示されてしまう

該当のソースコード

php

1<main> 2 <h2>カレンダー</h2> 3 <pre> 4 <?php 5 print("\n"); 6 for ($i=1; $i<=365; $i++){ 7 $day = date('n/j(D)' . strtotime('+' . $i . 'day')); 8 print($day . "\n"); 9 } 10 ?> 11 </pre> 12

試したこと

今日から1年後までの日付を表示したい

補足情報(FW/ツールのバージョンなど)

環境はwin10、atom、MAMPです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

$day = date('n/j(D)' . strtotime('+' . $i . 'day'));

$day = date('n/j(D)' , strtotime('+' . $i . 'day'));

PHPマニュアル date()
を参照してみて、サンプルと見比べてみてください。

関数の引数については
PHPマニュアル 関数の引数
に書いてあるのでこちらも読んでみてください。

引数のリストにより関数へ情報を渡すことができます。 このリストは、カンマで区切られた式のリストです。 引数の評価は、左から右の順番で行われます。

説明とリンクが足りなかったので追記

date()の第二引数で渡しているタイムスタンプはstrtotime()で生成されています。
strtotime
ここからリンクをたどって行って
サポートする日付と時刻の書式
相対的な書式
を確認してみてください。

例えば

PHP

1echo date("Y-m-d",strtotime('+1day'));

とすると、明日の日付が表示され、

PHP

1echo date("Y-m-d",strtotime('+0day'));

とすると本日の日付が表示されます。

質問の中では、'+'.$i.'day'と言う感じで文字列連結して、動的に数値部分が変わるような仕組みになっているので、

  1. どのような文字列を渡せば思い通りの結果になるのかを想定する
  2. $iが実際にどのような数字になっているかを確認しながら修正してみる(var_dump($i);等で出力してみる)

という2段階の手順で修正してみてください。


1年は365日とは限らない(閏年)ので、strtotime()とyearやmonthを使ってループ条件を指定するか自力で閏年を計算して条件に入れる等の工夫が必要になります。

投稿2020/02/11 13:36

編集2020/02/11 16:03
tanat

総合スコア18727

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

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

ash05

2020/02/11 13:44 編集

tanatさん 回答いただきありがとうございます! 早速、コードの書き換えを行って再度読み込みをしたのですが、今日の日付からではなく明日の日付から表示になってしまいました。 今日の日付から表示するには…もう少し調べてみます。 ありがとうございました。
tanat

2020/02/11 13:47

strtotime('+' . $i . 'day') の部分が何を示しているのかについて回答中のPHPマニュアルのdate()のページで確認し、 '+' . $i . 'day'の文字列連結の結果がどうなっているかを確認すれば修正可能だと思います。(修正箇所自体は一ヵ所なので、気づけばすぐだと思います)
ash05

2020/02/11 15:33

tanatさん ヒントをいただきありがとうございました。PHPマニュアルのdate()のページを隅々読んだのですが、あまりピンと来ず…。ただ、いろいろ試した結果【'+'】この部分を排除したら本日の日付からの表示にはなった?けどラストの日付が1日足りないし、ということになりまだ理解できていません。 ヒントいただいたのに、理解力が乏しく…もう一つヒントをいただけないでしょうか?
tanat

2020/02/11 16:01

回答にstrtotime()について追記しましたので確認してみてください。 ラストの日付が一日足りないというのは、どの様にループを制御しているかというところに起因します。 具体的には1年は365日とは限らないので、ループ条件にstrtotime()とyearの組み合わせを使う(PHPの日付関連関数は閏年に自動で対応してくれる)か、自力で閏年を判定するなどの工夫が必要です。
guest

0

php

1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6$start = (new DateTime())->setTime(0, 0, 0); 7$end = (new DateTime())->add(new DateInterval('P1Y')); 8?> 9<ul> 10 <?php while ($start < $end) : ?> 11 <li><?php echo $start->format('Y-m-d'); ?></li> 12 <?php $start->add(new DateInterval('P1D')); ?> 13 <?php endwhile; ?> 14</ul> 15

投稿2020/02/11 13:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問