# 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