date関数を使った非常に簡単な日時表示PHPプログラム



Notice: Use of undefined constant w - assumed 'w' in /home/member/sitemix_55218/site/jikan.html on line 40
2018年07月22日(日) 5時56分

現在の時間を表示する

PHPで日時を表示する方法は date("Y年m月d日 G時i分")と書くだけ!


時間が正しく表示されない場合

サーバーが海外などにある場合は以下の一文をdate関数の前に記述してください

date_default_timezone_set('Asia/Tokyo');//東京時間に設定

PHPで使う 日時表示する date関数について

date関数では引数によってさまざまなフォーマットに対応しています

Y4桁の年数
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)
U1970年1月1日からの通算秒数
zその年の通算日

曜日を漢字で表記したい場合はこうします

$youbi = array('日','月','火','水','木','金','土');
print $youbi[date(w)];

date関数の戻り値は '文字列型'です

date関数の戻り値は、date型でもint型でもなく
文字列型なので頭の片隅に入れといてください


その他の日時表示関数について

PHPには、date関数だけでなく日付けを扱う関数がいくつかあります
その中でも代表的なものをピックアップします

これから紹介する関数は、主に上記の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
2018年07月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日は 08月01日
先月の終りは 06月30日

一見よさそうな感じですが・・・・・
$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関数を使うと簡単です
(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関数たのむよ・・・・

トップページに戻る