दिनांक/समय मान सभी एक ही आधार संरचना में डाले जा रहे हैं, जो कि एक DateTime
है या DateTimeImmutable
ऑब्जेक्ट, और इसलिए स्वाभाविक रूप से दिनांक-केवल मानों में एक समय मान जोड़ा जाएगा (00:00:00
), और केवल-समय के मान दिनांक (वर्तमान दिनांक) के साथ आते हैं।
केकेपीएचपी एसक्यूएल डेटाटाइप के आधार पर विशिष्ट उपवर्गों का उपयोग करेगा, जो कि
. है\Cake\I18n\Time
या\Cake\I18n\FrozenTime
TIME
. के लिए ,TIMESTAMP
, औरDATETIME
\Cake\I18n\Date
या\Cake\I18n\FrozenDate
DATE
. के लिए
पहले केकेपीएचपी 3 संस्करणों में केवल \Cake\I18n\Time
. था ।
यह अच्छा होगा यदि केवल-समय के प्रकारों के लिए एक अलग वर्ग होगा, जिसमें एक उचित समय-केवल डिफ़ॉल्ट आउटपुट स्वरूप सेट होगा, लेकिन जब तक ऐसा कुछ नहीं जोड़ा जाता है, तब तक आपको आउटपुट प्रारूप का ध्यान रखना होगा। ।
आपके विचारों में प्रारूपित करें
यह आप पर निर्भर है कि आप इसे अपने विचारों में कैसे प्रदर्शित करते हैं। आप आसानी से i18nFormat()
. का उपयोग कर सकते हैं TIME
. की विधि क्लास इंस्टेंस
$record['start_time']->i18nFormat(
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
या TIME
हेल्पर, केवल टाइम पार्ट दिखाने के लिए
$this->Time->i18nFormat(
$record['start_time'],
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
मान लीजिए कि अगर सेंकना कॉलम के प्रकार के अनुसार समान कोड उत्पन्न करेगा तो यह चोट नहीं पहुंचाएगा, आप सुझाव दें कि एक एन्हांसमेंट के रूप में . जैसा कि उल्लेख किया गया है कि केवल-समय के कॉलम के लिए अतिरिक्त कक्षाओं (या शायद विकल्प) का उपयोग करने पर भी विचार करने लायक कुछ हो सकता है।
कस्टम टाइम क्लास का उपयोग करें
यदि आप यह व्यवहार हर जगह चाहते हैं जहां ऑब्जेक्ट के स्ट्रिंग प्रतिनिधित्व का उपयोग किया जा रहा है, बिना फॉर्मेटर को मैन्युअल रूप से आमंत्रित किए, तो आप एक विस्तारित \Cake\I18n\Time
का उपयोग कर सकते हैं। या \Cake\I18n\FrozenTime
एक ओवरराइड के साथ वर्ग $_toStringFormat
संपत्ति, ताकि यह तदनुसार तिथि को प्रारूपित करे।
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');
// ...
यह काफी आत्म-व्याख्यात्मक होना चाहिए, TIME
कॉलम जिन्हें TimeType
में मैप किया जा रहा है , अब उपयोग करेगा App\I18n\FrozenTimeOnly
डिफ़ॉल्ट के बजाय Cake\I18n\Time
।
DateTimeType::$dateTimeClass
पदावनत है
इससे निपटने के लिए, एक कस्टम डेटाबेस प्रकार की आवश्यकता होगी, जो काफी सरल भी है।
src/Database/Type/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);
}
}
यह ध्यान दिया जाना चाहिए कि वर्तमान में यह डेटा/समय वर्ग को दो बार तुरंत चालू करेगा, क्योंकि मूल निर्माता _setClassName()
का आह्वान करेगा। वह भी, जहां दिए गए वर्ग का एक उदाहरण तत्काल हो जाएगा।
src/config/bootstrap.php
use App\Database\Type\TimeOnlyType;
Type::map('time', TimeOnlyType::class);
तो यह क्या करेगा, डिफ़ॉल्ट TIME
. को ओवरराइड करता है कस्टम \App\Database\Type\TimeOnlyType
. का उपयोग करने के लिए मैपिंग टाइप करें वर्ग, जो बदले में \App\I18n\TimeOnly
. का उपयोग करेगा क्लास डेटाबेस मानों को PHP ऑब्जेक्ट्स में कनवर्ट करते समय, जो एक स्ट्रिंग में परिवर्तित होने पर, केवल-समय प्रारूप का उपयोग करेगा।
यह भी देखें
- रसोई की किताब> समय> डिफ़ॉल्ट लोकेल और फ़ॉर्मेट स्ट्रिंग सेट करना
- कुकबुक> डेटाबेस एक्सेस और ओआरएम> डेटाबेस मूल बातें> कस्टम प्रकार जोड़ना