date関数を使った非常に簡単な日時表示PHPプログラム
Notice: Use of undefined constant w - assumed 'w' in /home/member/sitemix_55218/site/jikan.html on line 40
2023年06月10日(土) 6時37分
現在の時間を表示する
PHPで日時を表示する方法は date("Y年m月d日 G時i分")と書くだけ!
時間が正しく表示されない場合
サーバーが海外などにある場合は以下の一文をdate関数の前に記述してください
date_default_timezone_set('Asia/Tokyo');//東京時間に設定
PHPで使う 日時表示する date関数について
date関数では引数によってさまざまなフォーマットに対応しています
Y | 4桁の年数 |
y | 下2桁の年数 |
m | 先頭0表示の月 |
n | 先頭に0をつけない月 |
M | 「Jan」など英字3文字の月表示 |
F | 「January」などの英字の月表示 |
d | 先頭に0をつけた日表示 |
j | 日表示(先頭に0なし) |
D | 「Mon」などの英字3文字の曜日表示 |
F | 「Sunday」などの英字の曜日表示 |
w | 曜日表示(日曜日=0,月曜=1,・・・土曜=6の数字) |
N | 曜日表示(月曜=1,・・・土曜=6 日曜=7の数字)(php5.1から) |
a | 「am」または「pm」 |
A | 「AM」または「PM」 |
h | 時(先頭0つきの12時間単位) |
H | 時(先頭0つきの24時間単位) |
g | 時(先頭0をつけない12時間単位) |
G | 時(先頭0をつけない24時間単位) |
i | 分(先頭に0をつけた2桁) |
s | 秒(先頭に0をつけた2桁) |
t | その月の日数(2月なら28とか29) |
U | 1970年1月1日からの通算秒数 |
z | その年の通算日 |
曜日を漢字で表記したい場合はこうします
print $youbi[date(w)];
date関数の戻り値は '文字列型'です
date関数の戻り値は、date型でもint型でもなく
文字列型なので頭の片隅に入れといてください
その他の日時表示関数について
PHPには、date関数だけでなく日付けを扱う関数がいくつかあります
その中でも代表的なものをピックアップします
date関数と組み合わせることにより便利な使い方ができます mktime関数
1970年1月1日00:00:00からの通算秒数を返す関数
echo date("t", mktime(0, 0, 0, 2, 1, 2010)); 説明 : まず date("t")としているので date(t)は、その月の最大日数です そしてmktime(0,0,0,2,1,2010)で日にちを指定しています。 この場合、2010年2月1日0時0分0秒の・・・という感じ 上記は、2010年の2月の最終日 を求めるプログラムになってます 結果 28
mktime関数で1日の曜日を調べる
カレンダー作成でよく使います
$nen = date(Y); $tuki = date(m); $youbi = array('日','月','火','水','木','金','土'); $start_w = date("w", mktime(0, 0, 0,$tuki,1, $nen)); echo $nen."年".$tuki."月1日は、".$youbi[$start_w]."曜日"; 結果 :
Notice: Use of undefined constant Y - assumed 'Y' in /home/member/sitemix_55218/site/jikan.html on line 162
Notice: Use of undefined constant m - assumed 'm' in /home/member/sitemix_55218/site/jikan.html on line 163
2023年06月1日は、木曜日
strtotime関数
1970年1月1日00:00:00からの通算秒数を返す関数
mktimeとよく似ているのですが、日付指定を英文形式で指定します
1週間後とかそんなのを求めている場合は、この関数を使うと便利だと思います
存在しない日を指定してしまった場合、FALSEが返ってきます
strtotime("now") // 今現在
strtotime("1 February 2010") // 2010年2月1日
strtotime("+2 day") // 2日後
strtotime("+3 week") // 3週間後
strtotime("-1month") // 先月
(next monthや -1monthは罠がある)
こんなのもいけるっぽい
strtotime("Wednesday this week") // 今週の水曜
strtotime("Monday next week") // 来週の月曜
strtotime("04/04/2012 09:34") // 日付け指定タイプ1
strtotime('2003-02-01') // 日付け指定タイプ2
(上の書き方はバグるからやめといたほうがいいっぽい)
使い方例 $lastmonday = strtotime("last Monday");// 前回の月曜日 echo date("d" ,$lastmonday); //最後の月曜日じゃないので注意(前回の月曜) $nextthursday = strtotime("next Thursday"); //次の木曜日 echo "次の木曜日は".date("m月d日" ,$nextthursday)."です";
strtotimeは罠がいっぱい
下のコードは来月の1日と先月の終りの日を求めるプログラムです
このコードには欠陥があります
$raigetu = date("m",strtotime("+1month")); $sengetu = date("m",strtotime("-1month")); $raigetu_1 = date("m月d日",mktime(0,0,0,$raigetu,1)); $sengetu_owari = date("m月t日",mktime(0,0,0,$sengetu,1)); echo "来月の1日は ".$raigetu_1."<br />"; echo "先月の終りは ".$sengetu_owari; 結果 : 来月の1日は 07月01日
先月の終りは 05月31日
一見よさそうな感じですが・・・・・
$sengetu = date("m",strtotime("-1month"));
ここで現在が3月31日だった場合・・・・・・
-1month は2月31日ということになります
2月31日など存在しないためおかしなことになります・・・・
同様に・・・・
$raigetu = date("m",strtotime("+1month"));
現在が8月31日だった場合・・・・
+1month は9月31日ということになります
9月は30日までなのでこれも 存在しない日付を指定してしまっています・・
次は特定の年の成人の日をあらわすプログラム
成人の日は 1月の第二月曜日という
プログラムで書くとちょっとややこしいことになってますw
年によって、日にちが微妙に変ります。
(strtotime関数で第3木曜日とかそういうのを求めると
予期せぬ結果になる場合があるので注意してください)
$nen = 2012; $seijin = strtotime("second monday January $nen"); echo $nen."年の成人の日は".date("m月d日" ,$seijin)."です"; 結果 :2012年の成人の日は01月09日です
上のようにstrtotimeの中に変数を使うこともできます
strtotime関数の注意点
上記のように大変便利なstrtotime関数ですが
バージョンによって、動きがおかしかったりすることがあるので
過信はしないほうが懸命です
この記事を書いているのは2012年です
例えば、上の成人の日を計算するプログラムですが・・・
$seijin = strtotime("second monday January this year");
echo "成人の日は".date("Y年m月d日" ,$seijin)."です";
結果 :
成人の日は2012年01月16日です
本当の2012年の成人の日は、1月9日です
this yearが正常に作動しているのか?実験してみました
(これを書いているのは2012年です)
$year = date("Y" ,strtotime("this year"));
echo $year;
結果 : 2012 //注:2012年に実行した結果です
どうも、strtotime関数で
第〇 ?曜日を求めると変になることが多いみたいです
では 第〇 ?曜日はどうやって求めるんでしょうか?
やはり mktime関数で調べるしかないんでしょうか?
ちょっとやってみます
2012年の1月の第2月曜日(成人の日) を求めるPHPプログラム $siteiyear = 2012; $siteimonth = 1; $dainanweek = 2;// 第$dainan $youbi曜日 $youbi = "月";// 月曜日なら "月"と入力してください switch($youbi){ case "月": $siteiyoubi = 1; break; case "火": $siteiyoubi = 2; break; case "水": $siteiyoubi = 3; break; case "木": $siteiyoubi = 4; break; case "金": $siteiyoubi = 5; break; case "土": $siteiyoubi = 6; break; case "日": $siteiyoubi = 7; break; } $first_day = mktime(0,0,0,$siteimonth,1,$siteiyear); $tukihajime_youbi = date("N",$first_day);//1日の曜日 $daiitiyoubi = $siteiyoubi - (int)$tukihajime_youbi; //指定曜日の第1週目を算出 if($daiitiyoubi<0 ){ $daiitiyoubi = (int)$daiitiyoubi + 7 ; // -(マイナス)になった場合 +7してスタート } $result = ($daiitiyoubi+7 * $dainanweek) - 6; if(checkdate($siteimonth,$result,$siteiyear)){ //存在する日なのかチェックします echo $siteiyear."年".$siteimonth."月の第"// 改行 .$dainanweek.$youbi."曜日は".$result."日です"; }else{ echo "存在しない日付です"; } 結果 : 2012年1月の第2月曜日は9日です
えらいめんどくさいですw
正直この計算式であってるかも不安です・・・・・
strtotime関数たのむよ・・・・