#PHPでコーディング 22
// 指定日の7日前(1週間前)を求める
echo date( "Y-m-d", strtotime( "-7 days", strtotime("2021-03-01") ) );
→ "2021-02-22"
うるう年なども考慮して正確に
日付の足し算・引き算ができるので便利。
※文字列⇔UNIX秒 の変換部分が
ややこしくなりがちなので注意。

#PHPでコーディング 22
// 指定日の7日前(1週間前)を求める
echo date( "Y-m-d", strtotime( "-7 days", strtotime("2021-03-01") ) );
→ "2021-02-22"
うるう年なども考慮して正確に
日付の足し算・引き算ができるので便利。
※文字列⇔UNIX秒 の変換部分が
ややこしくなりがちなので注意。
#PHPでコーディング 21
日付や時刻の加減算:
strtotime( 加減算を指定する文字列, 基準日時のUNIX秒 )
→加減算されたUNIX秒が返る。
詳しい指定方法
https://www.softel.co.jp/blogs...
±1 second
±1 minute
±1 hour
±1 day
±1 week
±1 month
±1 year
±2以上の場合,複数形はsを付ける。
#PHPでコーディング 20
// タイムゾーンを日本に
date_default_timezone_set("Asia/Tokyo");
// 基準日付のUNIX秒
$a=strtotime("2021-04-01");
// 基準から1日後のUNIX秒
$b=strtotime("+1 day", $a);
// 基準から1日後の日時文字列
$c=date("Y/m/d H:i:s", $b);
→ "2021/04/02 00:00:00"
#PHPでコーディング 19
strtotimeは
第1引数の文字列を
UNIX秒に変換するのだが
第1引数に"+1 second"など
差分を指定した場合,
第2引数に
基準となるUNIX秒を指定できる。
※省略すると現在のUNIX秒が渡される。
① strtotime( "+1 second" )
② strtotime( "+1 second", time() )
↑
同じ
#PHPでコーディング 18
strtotimeの引数には,
日時文字列を渡す以外に
現在時刻からの差分を指定できる。
// 現在のUNIX時刻 (UTC)
echo time();
→ 1623123676
// 現在の1秒後
echo strtotime("+1 second");
→ 1623123677
// 現在の2秒前
echo strtotime("-2 seconds");
→ 1623123674
#PHPでコーディング 17
// タイムゾーンを日本に
date_default_timezone_set("Asia/Tokyo");
// 現在のUNIX時刻
echo time(); ①
// 現在の日時文字列
echo date("Y-m-d H:i:s");
// 現在の日時文字列をUNIX秒に変換
echo strtotime( date("Y-m-d H:i:s") ); ②
①と②で同じ結果が返る。
#PHPでコーディング 16
// タイムゾーンをUTCに
date_default_timezone_set("UTC");
echo date("Y/n/d H:i:s")
. ", "
. date("Y/n/d H:i:s", time());
// タイムゾーンを日本に
date_default_timezone_set("Asia/Tokyo");
echo date("Y/n/d H:i:s")
. ", "
. date("Y/n/d H:i:s", time());
#PHPでコーディング 15
date()の第2引数には
UNIX時刻を渡せる。
省略した場合
現在時刻が指定される。
①
date( "Y/m/d H:i:s" )
②
date( "Y/m/d H:i:s", time() )
↑
同じ結果を返す。
どちらも内部的に
現在UNIX秒をUTCで読み込み
デフォルトタイムゾーンでの日時文字列を表示する。
#PHPでコーディング 14
time() で取得する現在UNIX秒は
常にUTCでの値となり
タイムゾーンに依存しない。
// UTCでUNIX時刻
date_default_timezone_set("UTC");
echo time();
// 日本のタイムゾーンでUNIX時刻
date_default_timezone_set("Asia/Tokyo");
echo time();
↑
この2つは同じ値。
#PHPでコーディング 13
// この実行環境におけるINT型の最大値
echo PHP_INT_MAX;
→ 9223372036854775807 (paizaの場合)
// 扱える最大値に+1した後,無理やり整数に変換
echo intval( PHP_INT_MAX+1 );
→ -9223372036854775808
「オーバーフローして負になった」?
#PHPでコーディング 12
// この実行環境におけるINT型の最大値
echo PHP_INT_MAX;
→ 9223372036854775807 (paizaの場合)
この値は約9.22×10^18
// この環境で扱える整数の最大値に+1してみる
echo PHP_INT_MAX + 1;
→ 9.2233720368548E+18
int型から自動的にfloat型になる。
#PHPでコーディング 11
// この実行環境におけるINT型の最大値
echo PHP_INT_MAX;
→ 9223372036854775807 (paizaの場合)
// その数は何ビットか(2の何乗か)
echo log( PHP_INT_MAX + 1, 2 );
→ 63
※+1 した時点でintからfloatにキャストされている。
符号部分が1ビットなので
64ビット整数
#PHPでコーディング 10
// このPHP実行環境におけるINT型のサイズ
echo intval( PHP_INT_SIZE );
→ 8 (paizaの場合)
8バイト=64ビット
定義済みの変数
https://www.php.net/manual/ja/...
PHP_INT_SIZE (int)
この PHP ビルドにおける整数型のサイズ (バイト数)。
// 32ビット整数で表現可能な最大の値
// 2の31乗-1
$a = pow( 2, 31 ) - 1;
// 日付として表現してみる
date_default_timezone_set("UTC");
echo date("Y-m-d H:i:s", $a);
→ "2038-01-19 03:14:07"
この時刻を過ぎると
2038年問題が起きる
https://ja.wikipedia.org/wiki/...
以前,UNIX時間は32ビット整数で表現されていた。
32ビット整数の最大値
2147483647を超えると
時刻を正しく扱えなくなる。(2038年問題)
32ビット整数のうち
1ビットは符号として使用。
残りの31ビットで表現できる整数の最大値は
2^31 - 1
=2147483648 - 1
=2147483647
UNIXエポックより前の
UNIXタイムスタンプは
負の整数値
// タイムゾーンをUTCに
date_default_timezone_set("UTC");
// UNIXエポックの1秒前
echo strtotime("1969-12-31 23:59:59");
→ -1
// UNIXエポックの1分前
echo strtotime("1969-12-31 23:59:00");
→ -60
UNIX秒の取得サンプル
// タイムゾーンをUTCに
date_default_timezone_set("UTC");
// UNIXエポック
echo strtotime("1970-01-01 00:00:00");
→ 0
// 1秒後
echo strtotime("1970-01-01 00:00:01");
→ 1
// 1分後
echo strtotime("1970-01-01 00:01:00");
→ 60
・strtotime
https://www.php.net/manual/ja/...
日付文字列を
UNIXタイムスタンプ(INT)に変換する。
(1970年 1月1日 00:00:00 UTC からの経過秒数)
・UNIX時間
https://ja.wikipedia.org/wiki/...
1970年1月1日午前0時0分0秒 (UNIXエポック) からの経過秒数。
// 日時文字列を読み取って表示フォーマット変更
echo date( "Y/m/d H時i分s秒", strtotime("2021-04-01 12:34:56") );
→ "2021/04/01 12時34分56秒"
// 存在しない日付を文字列から読み取った場合
echo date( "Y/m/d", strtotime("2021-02-29") );
→ "2021/03/01"
date format
https://www.php.net/manual/ja/...
"w"
曜日を数値で返す。
0 (日曜) から 6 (土曜)
// 曜日番号を出力
echo date("w");
→ 2 (火曜日の場合)
// 曜日番号に対応した漢字略称
echo [ "日", "月", "火", "水", "木", "金", "土" ][
date("w")
];
→ "火"