Try   HackMD

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