CakePHP 将 MySQL 日期时间转换为 Unix 时间戳
CakePHP Convert MySQL DateTime to Unix Timestamp
我在尝试 select DATETIME 字段并使用 UNIX_TIMESTAMP() 函数时遇到问题。
这是我的自定义查找器:
public function findApi(Query $query, array $options) {
$unixTimestamp = $query->func()->unix_timestamp(['sample_time' => 'identifier']);
return $query->select([
'sample_time' => $unixTimestamp,
'min' => 'min_psi',
'max' => 'max_psi',
])
->where([
'machine_id' => $options['machine_id'],
'sample_time >=' => $options['start'],
'sample_time <=' => $options['end']
]);
}
但是当我尝试获取结果集并且我的采样时间是 false:
时,我不断收到 "failed to parse" 警告
Warning (2): DateTimeImmutable::modify(): Failed to parse time string (1564618674) at position 8 (7): Unexpected character [CORE/src/Database/Type/DateTimeType.php, line 188]
Code Context
if ($previousHandler) {
return $previousHandler($code, $message, $file, $line, $context);
}
$value = '1564618674'
$driver = object(Cake\Database\Driver\Mysql) {
'connected' => true
}
$instance = object(Cake\I18n\FrozenTime) {
'time' => '2019-10-23T17:01:38+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
}
Cake\Core\BasePlugin::{closure}() - ROOT/vendor/cakephp/debug_kit/config/bootstrap.php, line 42
DateTimeImmutable::modify() - [internal], line ??
Cake\Database\Type\DateTimeType::toPHP() - CORE/src/Database/Type/DateTimeType.php, line 188
Cake\Database\FieldTypeConverter::__invoke() - CORE/src/Database/FieldTypeConverter.php, line 135
Cake\Database\Statement\CallbackStatement::fetch() - CORE/src/Database/Statement/CallbackStatement.php, line 59
Cake\ORM\ResultSet::_fetchResult() - CORE/src/ORM/ResultSet.php, line 487
Cake\ORM\ResultSet::valid() - CORE/src/ORM/ResultSet.php, line 277
Cake\ORM\ResultSet::first() - CORE/src/ORM/ResultSet.php, line 299
Cake\ORM\Query::first() - CORE/src/Datasource/QueryTrait.php, line 471
App\Controller\Api\WaterPressuresController::getJsonResults() - APP/Controller/Api/WaterPressuresController.php, line 64
App\Controller\Api\WaterPressuresController::index() - APP/Controller/Api/WaterPressuresController.php, line 22
Cake\Controller\Controller::invokeAction() - CORE/src/Controller/Controller.php, line 610
Cake\Http\ActionDispatcher::_invoke() - CORE/src/Http/ActionDispatcher.php, line 120
Cake\Http\ActionDispatcher::dispatch() - CORE/src/Http/ActionDispatcher.php, line 94
Cake\Http\BaseApplication::__invoke() - CORE/src/Http/BaseApplication.php, line 235
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE/src/Routing/Middleware/RoutingMiddleware.php, line 162
/src/Controller/Api/WaterPressuresController.php (line 66)
[
'sample_time' => false,
'min_val' => (int) 75,
'max_val' => (int) 91
]
看起来 CakePHP 正在尝试使用 FieldTypeConverter 转换字段。如何防止转换以便我可以使用 UNIX_TIMESTAMP 函数并将结果作为整数而不是日期时间?
您正在 select 为现有列创建 unix 时间戳,它属于某种 date/time 类型,但 CakePHP 的 date/time 类型转换器不支持 unix 时间戳,它需要 date/time-ish 格式的值,如 Y-m-d H:i:s
.
您可以通过简单地在 select 列表中使用不同的别名来解决这个问题,例如:
'sample_timestamp' => $unixTimestamp,
或通过重新映射查询类型:
$query->getSelectTypeMap()->addDefaults(['sample_time' => 'integer']);
我建议您也考虑在实际需要时转换 PHP 级别的值,即 ORM 为您的 date/time-ish 列创建的 date/time 对象有一个 getTimestamp()
方法,所以你可以这样做:
$entity->sample_time->getTimestamp()
我在尝试 select DATETIME 字段并使用 UNIX_TIMESTAMP() 函数时遇到问题。
这是我的自定义查找器:
public function findApi(Query $query, array $options) {
$unixTimestamp = $query->func()->unix_timestamp(['sample_time' => 'identifier']);
return $query->select([
'sample_time' => $unixTimestamp,
'min' => 'min_psi',
'max' => 'max_psi',
])
->where([
'machine_id' => $options['machine_id'],
'sample_time >=' => $options['start'],
'sample_time <=' => $options['end']
]);
}
但是当我尝试获取结果集并且我的采样时间是 false:
时,我不断收到 "failed to parse" 警告Warning (2): DateTimeImmutable::modify(): Failed to parse time string (1564618674) at position 8 (7): Unexpected character [CORE/src/Database/Type/DateTimeType.php, line 188]
Code Context
if ($previousHandler) {
return $previousHandler($code, $message, $file, $line, $context);
}
$value = '1564618674'
$driver = object(Cake\Database\Driver\Mysql) {
'connected' => true
}
$instance = object(Cake\I18n\FrozenTime) {
'time' => '2019-10-23T17:01:38+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
}
Cake\Core\BasePlugin::{closure}() - ROOT/vendor/cakephp/debug_kit/config/bootstrap.php, line 42
DateTimeImmutable::modify() - [internal], line ??
Cake\Database\Type\DateTimeType::toPHP() - CORE/src/Database/Type/DateTimeType.php, line 188
Cake\Database\FieldTypeConverter::__invoke() - CORE/src/Database/FieldTypeConverter.php, line 135
Cake\Database\Statement\CallbackStatement::fetch() - CORE/src/Database/Statement/CallbackStatement.php, line 59
Cake\ORM\ResultSet::_fetchResult() - CORE/src/ORM/ResultSet.php, line 487
Cake\ORM\ResultSet::valid() - CORE/src/ORM/ResultSet.php, line 277
Cake\ORM\ResultSet::first() - CORE/src/ORM/ResultSet.php, line 299
Cake\ORM\Query::first() - CORE/src/Datasource/QueryTrait.php, line 471
App\Controller\Api\WaterPressuresController::getJsonResults() - APP/Controller/Api/WaterPressuresController.php, line 64
App\Controller\Api\WaterPressuresController::index() - APP/Controller/Api/WaterPressuresController.php, line 22
Cake\Controller\Controller::invokeAction() - CORE/src/Controller/Controller.php, line 610
Cake\Http\ActionDispatcher::_invoke() - CORE/src/Http/ActionDispatcher.php, line 120
Cake\Http\ActionDispatcher::dispatch() - CORE/src/Http/ActionDispatcher.php, line 94
Cake\Http\BaseApplication::__invoke() - CORE/src/Http/BaseApplication.php, line 235
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE/src/Routing/Middleware/RoutingMiddleware.php, line 162
/src/Controller/Api/WaterPressuresController.php (line 66)
[
'sample_time' => false,
'min_val' => (int) 75,
'max_val' => (int) 91
]
看起来 CakePHP 正在尝试使用 FieldTypeConverter 转换字段。如何防止转换以便我可以使用 UNIX_TIMESTAMP 函数并将结果作为整数而不是日期时间?
您正在 select 为现有列创建 unix 时间戳,它属于某种 date/time 类型,但 CakePHP 的 date/time 类型转换器不支持 unix 时间戳,它需要 date/time-ish 格式的值,如 Y-m-d H:i:s
.
您可以通过简单地在 select 列表中使用不同的别名来解决这个问题,例如:
'sample_timestamp' => $unixTimestamp,
或通过重新映射查询类型:
$query->getSelectTypeMap()->addDefaults(['sample_time' => 'integer']);
我建议您也考虑在实际需要时转换 PHP 级别的值,即 ORM 为您的 date/time-ish 列创建的 date/time 对象有一个 getTimestamp()
方法,所以你可以这样做:
$entity->sample_time->getTimestamp()