Tất cả các giá trị Ngày / Giờ đều được truyền đến cùng một cấu trúc cơ sở, đó là DateTime
hoặc DateTimeImmutable
đối tượng, và vì vậy, các giá trị chỉ ngày tự nhiên sẽ có giá trị thời gian được thêm vào (00:00:00
), và các giá trị chỉ thời gian đi kèm với ngày tháng (ngày hiện tại).
CakePHP sẽ sử dụng các lớp con cụ thể tùy thuộc vào kiểu dữ liệu SQL, đó là
-
\Cake\I18n\Time
hoặc\Cake\I18n\FrozenTime
trongTIME
,TIMESTAMP
vàDATETIME
-
\Cake\I18n\Date
hoặc\Cake\I18n\FrozenDate
choDATE
Trong các phiên bản CakePHP 3 trước đó chỉ có \Cake\I18n\Time
.
Sẽ rất tuyệt nếu có một lớp riêng biệt cho các loại chỉ thời gian, sẽ có một định dạng đầu ra mặc định chỉ thời gian thích hợp, nhưng cho đến khi một cái gì đó tương tự được thêm vào, bạn sẽ phải tự mình xử lý định dạng đầu ra. .
Định dạng trong chế độ xem của bạn
Làm thế nào để hiển thị điều này trong chế độ xem của bạn là tùy thuộc vào bạn. Bạn có thể dễ dàng sử dụng i18nFormat()
phương thức của Time
cá thể lớp
$record['start_time']->i18nFormat(
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
hoặc Time
người trợ giúp, để chỉ hiển thị phần thời gian
$this->Time->i18nFormat(
$record['start_time'],
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
Đoán rằng sẽ không có vấn đề gì nếu baking sẽ tạo mã tương tự theo loại cột, bạn có thể muốn đề xuất điều đó như một sự cải tiến . Như đã đề cập, việc sử dụng các lớp bổ sung (hoặc có thể là các tùy chọn) cho các cột chỉ thời gian cũng có thể là điều đáng để xem xét.
Sử dụng lớp thời gian tùy chỉnh
Nếu bạn muốn hành vi này ở mọi nơi mà biểu diễn chuỗi của đối tượng đang được sử dụng, mà không cần phải gọi trình định dạng theo cách thủ công, thì bạn có thể sử dụng \Cake\I18n\Time
mở rộng hoặc \Cake\I18n\FrozenTime
lớp có $_toStringFormat
bị ghi đè , để nó định dạng ngày tháng cho phù hợp.
src / I18n / FrozenTimeOnly.php
namespace App\I18n;
use Cake\I18n\FrozenTime;
class FrozenTimeOnly extends FrozenTime
{
protected static $_toStringFormat = [
\IntlDateFormatter::NONE,
\IntlDateFormatter::SHORT
];
}
src / config / bootstrap.php
use Cake\Database\Type\TimeType;
use App\I18n\FrozenTimeOnly;
TimeType::$dateTimeClass = FrozenTimeOnly::class;
// remove the default `useImmutable()` call, you may however
// want to keep further calls for formatting and stuff
Type::build('time');
// ...
Điều này sẽ tự giải thích khá nhiều, time
cột đang được ánh xạ tới TimeType
, bây giờ sẽ sử dụng App\I18n\FrozenTimeOnly
thay vì Cake\I18n\Time
mặc định .
DateTimeType::$dateTimeClass
không được dùng nữa
Để đối phó với điều đó, loại cơ sở dữ liệu tùy chỉnh sẽ được yêu cầu, loại cơ sở dữ liệu này cũng khá đơn giản.
src / Cơ sở dữ liệu / Loại / TimeOnlyType.php
namespace App\Database\Type;
use App\I18n\FrozenTimeOnly;
use Cake\Database\Type\TimeType;
class TimeOnlyType extends TimeType
{
public function __construct($name)
{
parent::__construct($name);
$this->_setClassName(FrozenTimeOnly::class, \DateTimeImmutable::class);
}
}
Cần lưu ý rằng hiện tại điều này sẽ khởi tạo một lớp dữ liệu / thời gian hai lần, vì hàm tạo cha sẽ gọi _setClassName()
cũng là nơi mà một phiên bản của lớp đã cho sẽ được khởi tạo.
src / config / bootstrap.php
use App\Database\Type\TimeOnlyType;
Type::map('time', TimeOnlyType::class);
Vì vậy, điều này sẽ làm, là ghi đè time
mặc định gõ ánh xạ để sử dụng \App\Database\Type\TimeOnlyType
tùy chỉnh , đến lượt nó sẽ sử dụng \App\I18n\TimeOnly
khi chuyển đổi các giá trị cơ sở dữ liệu sang các đối tượng PHP, khi được chuyển đổi thành một chuỗi, sẽ sử dụng định dạng chỉ thời gian.
Xem thêm
- Sách dạy nấu ăn> Thời gian> Đặt chuỗi định dạng và ngôn ngữ mặc định
- Sách dạy nấu ăn> Cơ sở dữ liệu Truy cập &ORM> Khái niệm cơ bản về cơ sở dữ liệu> Thêm loại tùy chỉnh