【やさしく解説】PHP8上級試験の模擬問題(30)

PHP
スポンサーリンク

PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ最終回です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回は関数に関する問題です。PHPの基本的な関数の使い方から、日付や時刻の扱い、タイムゾーン設定まで、幅広い知識が問われる内容になっています。実務でも頻繁に使う機能ばかりなので、ここでしっかり押さえていきましょう。

PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/ 

問題文

関数 に関する説明の中で、誤っているものを1つ選びなさい。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。

declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。

date_create()
この関数は次の関数のエイリアスです。 DateTime::__construct()

strtotime ( string $datetime , int|null $baseTimestamp = null ) : int|false
この関数は英語の書式での日付を含む文字列が指定されることを期待しており、 baseTimestamp で与えられたその形式から Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの経過秒数) への変換を試みます。 baseTimestamp が指定されていない場合は現在日時に変換します。
成功時はタイムスタンプ、そうでなければ false を返します。

time ( ) : int

date_default_timezone_set ( string $timezoneId ) : bool date_default_timezone_get ( ) : string
この関数は、デフォルトのタイムゾーンを以下の優先順位で取得して返します。
・date_default_timezone_set() 関数を使用して 設定したタイムゾーン (もし何か設定されていれば) を読み込む
・date.timezone ini オプション (設定されていれば) を読み込む
・上のすべてが失敗した場合は、date_default_timezone_get() はデフォルトのタイムゾーンである UTC を返します。

(1)
date_create() 関数を使うと DateTime クラスのインスタンスが作成できる。
そのため、以下のコード

$date_obj = date_create('2021-01-01 11:22:33');
var_dump($date_obj);

を実行すると、結果は次のとおりとなる。

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2021-01-01 11:22:33.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

(2)
strtotime() 関数を使うと英文形式の日付を Unix タイムスタンプに変換することが出来る。
strtotime() は様々な書式を扱う事が出来るため、例えば “2008/6/30″、”30-6-2008″、”30-June 2008″、”July 1st, 2008” などの様々な書式に対応している。
そのため、以下のコード

$t = strtotime('July 1st, 2008 4:08:37 pm');
var_dump($t);
echo date('Y-m-d H:i:s', $t) , PHP_EOL;
echo PHP_EOL;
$t = strtotime('July 1st, 1000 4:08:37 pm');
var_dump($t);


を実行すると、結果は次のとおりとなる。

int(1214928517)
2008-07-01 16:08:37
bool(false)

(3)
time() 関数を使うと現在の Unix タイムスタンプを得る事ができる。
そのため、以下のコード

$t = time();
var_dump($t);


を実行すると、結果は次のとおりとなる。

int(1610912345)


(4)
date_default_timezone_set() 関数を使うとスクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを設定する事ができる。
また、date_default_timezone_get() 関数を使うとスクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを取得する事ができる。
そのため、以下のコード

$t = strtotime('2038-1-19 3:14:8');
var_dump( date_default_timezone_get() );
echo date(DATE_ATOM, $t), PHP_EOL;
echo PHP_EOL;

date_default_timezone_set('Asia/Tokyo');
var_dump( date_default_timezone_get() );
echo date(DATE_ATOM, $t), PHP_EOL;


を実行すると、結果は次のとおりとなる。

string(3) "UTC"
2038-01-01T03:14:08+00:00

string(10) "Asia/Tokyo"
2038-01-01T12:14:08+09:00

解説

選択肢1の解説

正しいです。
date_create() は DateTime クラスのインスタンスを作るショートカット関数(エイリアス)です。

$date_obj = date_create('2021-01-01 11:22:33');
var_dump($date_obj);

DateTime クラスは日付を扱う便利なクラスです。date_create() は new DateTime(…) と同じです。指定した日時の情報が DateTime オブジェクトとして作られます。タイムゾーンが設定されていなければ UTC になります。

選択肢2の解説

正しいです。
strtotime() は、「英語っぽい日付文字列」を UNIXタイムスタンプに変換する関数です。

$t = strtotime('July 1st, 2008 4:08:37 pm');
var_dump($t);
echo date('Y-m-d H:i:s', $t), PHP_EOL;

$t = strtotime('July 1st, 1000 4:08:37 pm');
var_dump($t);

strtotime() はかなり自由なフォーマットを解釈できます。date() を使えば、タイムスタンプを人間が読める日付に戻せます。ただし、1000年などの昔すぎる日付は false を返すことがあります(環境依存でパースできない)。

選択肢3の解説

正しいです。
time() は今この瞬間のUNIXタイムスタンプを返す関数です。

$t = time();
var_dump($t);

結果は int(1610912345) のように出ます(その瞬間の秒数)。これは「1970年1月1日 00:00:00 UTC」からの経過秒数です。

選択肢4の解説

誤りです。
コードと実行結果の日付があっていません。

正解選択肢

以上より選択肢4が正解となります。

他の問題へ

コメント

タイトルとURLをコピーしました