# postgresqlからselectした”timestamp with(out) timezone”のデータを\DateTimeクラスに変換する ###### tags: `php` qiitaの下書きに眠っていた記事をこちらに吐き出す。2020年6月頃に書いた記事。 --- foreach文を使って変換するのがあまり好きではなかった。 ``` <?php function convertToDateTime(array $row) { $row['datetime'] = \DateTime::createFromFormat('Y-m-d h:i:sO', $row['datetime']); return $row; } $set_row = [ $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], ]; var_dump(array_map('convertToDateTime', $set_row)); ``` `array_map`を使うとこんな感じで、各カラムについて`\DateTime`クラスの変数に変換してくれる。 ``` $ php test.php array(1) { [0]=> array(2) { ["id"]=> string(10) "not modify" ["datetime"]=> object(DateTime)#1 (3) { ["date"]=> string(26) "2020-05-05 02:18:33.000000" ["timezone_type"]=> int(1) ["timezone"]=> string(6) "+00:00" } } } ...(以下略 ``` `$set_row`の各列にある`datetime`行は、postgresqlのデータ型の "timestamp with timezone" をselectで引っ張ってきた形式を想定している。指定するフォーマットを変更してもらえば、 "timestamp with timezone" でも同じように変換できると思う。 ちなみに、少し冷静になってさっきの処理を`foreach`で書き直すと以下のようになる。 ``` <?php $set_row = [ $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], $set_row = ['id' => 'not modify', 'datetime' => '2020-05-05 02:18:33+00'], ]; foreach ( $set_row as $ ``` 可読性考えると素直に`foreach`回したほうがよくね?と思えてきた。 # 環境 ``` $ php --version PHP 7.2.24-0ubuntu0.18.04.4 (cli) (built: Apr 8 2020 15:45:57) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.24-0ubuntu0.18.04.4, Copyright (c) 1999-2018, by Zend Technologies ``` # 参考 https://www.php.net/manual/ja/function.array-map.php