質問編集履歴

2 修正

san11

san11 score 8

2017/03/02 19:36  投稿

Cakephp3 Datetime型のミリ秒取得方法について
###前提・実現したいこと
CakePHP3.4.2にてDatetime(3)に設定されているカラムのデータをfindにて取得するとミリ秒以下が削られてしまいます。
こちらをミリ秒まで取得する方法をご存じの方いらっしゃいませんでしょうか?
###Datetime型のDebugの内容は以下の通りです
```ここに言語を入力
object(Cake\I18n\FrozenTime) {
   'time' => '2017-03-02T01:40:10+09:00',
   'timezone' => 'Asia/Tokyo',
   'fixedNowTime' => false
}
DB上に実際に格納されている値:「2017-03-02 01:40:10.917」
i18nFormat('yyyy-MM-dd HH:mm:ss.S')も試してみましたが、ミリ秒が0になってしまいます。
```
###補足情報(言語/FW/ツール等のバージョンなど)
CakePHP 3.4.2
PHP 7.1.2
MariaDB 10.1.10
よろしくお願い致します。
###下記の回答を参考にさせて頂き動作が確認出来ましたので記載致します。
###下記の回答を参考にさせて頂き動作が確認出来ましたのでコードを記載致します。
```PHP
//bootstrap.php
Type::map('dtm', 'App\Database\Type\DateTimeMilliType');
Type::build('dtm')
   ->useImmutable();
```
```PHP
//DateTimeMilliType.php
namespace App\Database\Type;
use Cake\Database\Type\DateTimeType;
use Cake\Database\Driver;
class DateTimeMilliType extends DateTimeType {
   protected $_format = 'Y-m-d H:i:s.u';
   public function toPHP($value, Driver $driver) {
       if ($value === null || strpos($value, '0000-00-00') === 0) {
           return null;
       }
       if (strpos($value, '.') !== false) {
           //list($value) = explode('.', $value);
       }
       $instance = clone $this->_datetimeInstance;
       $tmp_obj = $instance->createFromFormat('Y-m-d H:i:s.u', $value);
       return $tmp_obj;
   }
}
```
```PHP
//table
   protected function _initializeSchema(Schema $schema) {
       
       $schema->columnType("modified", 'dtm');
       $schema->columnType("created", 'dtm');
       return $schema;
   }
```
```PHP
//ミリ秒まで取得
//debug()だとミリ秒まで表示されないがformat()で表示されました  
//i18nFormatでも何故かミリ秒が表示されませんでした  
$item->created->format('Y-m-d H:i:s.u')
```
  • CakePHP

    2521 questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

1 コード追記

san11

san11 score 8

2017/03/02 19:31  投稿

Cakephp3 Datetime型のミリ秒取得方法について
###前提・実現したいこと
CakePHP3.4.2にてDatetime(3)に設定されているカラムのデータをfindにて取得するとミリ秒以下が削られてしまいます。
こちらをミリ秒まで取得する方法をご存じの方いらっしゃいませんでしょうか?
###Datetime型のDebugの内容は以下の通りです
```ここに言語を入力
object(Cake\I18n\FrozenTime) {
   'time' => '2017-03-02T01:40:10+09:00',
   'timezone' => 'Asia/Tokyo',
   'fixedNowTime' => false
}
DB上に実際に格納されている値:「2017-03-02 01:40:10.917」
i18nFormat('yyyy-MM-dd HH:mm:ss.S')も試してみましたが、ミリ秒が0になってしまいます。
```
###補足情報(言語/FW/ツール等のバージョンなど)
CakePHP 3.4.2
PHP 7.1.2
MariaDB 10.1.10
よろしくお願い致します。
よろしくお願い致します。
###下記の回答を参考にさせて頂き動作が確認出来ましたので記載致します。
```PHP
//bootstrap.php
Type::map('dtm', 'App\Database\Type\DateTimeMilliType');
Type::build('dtm')
   ->useImmutable();
```
```PHP
//DateTimeMilliType.php
namespace App\Database\Type;
use Cake\Database\Type\DateTimeType;
use Cake\Database\Driver;
class DateTimeMilliType extends DateTimeType {
   protected $_format = 'Y-m-d H:i:s.u';
   public function toPHP($value, Driver $driver) {
       if ($value === null || strpos($value, '0000-00-00') === 0) {
           return null;
       }
       if (strpos($value, '.') !== false) {
           //list($value) = explode('.', $value);
       }
       $instance = clone $this->_datetimeInstance;
       $tmp_obj = $instance->createFromFormat('Y-m-d H:i:s.u', $value);
       return $tmp_obj;
   }
}
```
```PHP
//table
   protected function _initializeSchema(Schema $schema) {
       
       $schema->columnType("modified", 'dtm');
       $schema->columnType("created", 'dtm');
       return $schema;
   }
```
```PHP
//ミリ秒まで取得
$item->created->format('Y-m-d H:i:s.u')
```
  • CakePHP

    2521 questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る