datetime - पैचिंग/बचत करने पर दिनांक/समय मानों का गलत अर्थ क्यों है?



cakephp internationalization (1)

मैं एक केकपीप 3 फॉर्म से डेटा को सहेजने का प्रयास करता हूं। सभी डेटा अच्छी तरह से सहेजे गए हैं लेकिन डेट-टाइम नहीं हैं मेरे पास 2 दिन समय फ़ील्ड है उन फ़ील्ड्स jquery-ui विजेट से भरे हुए हैं

समस्या तब होती है जब अनुबंध इकाई

$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
  • $ की डिबग-> अनुरोध-> डेटा:

    'user_id' => '1',
    'description' => 'test',
    'starttime' => '2015/11/15 10:00',
    'endtime' => '2015/11/15 12:10'
  • मेरे ऑब्जेक्ट के डीबग $ pacthEntity के बाद हस्तक्षेप:

वस्तु (एप्लिकेशन \ मॉडल \ इकाई \ हस्तक्षेप)

'id' => (int) 3,
'user_id' => (int) 1,
'description' => 'test',
'starttime' => null,
'endtime' => null
...

शुरुआती समय और समाप्ति समय शून्य हो जाता है और मुझे समझ में नहीं आता कि क्यों

क्या किसी के पास पहले यह पीबी था?

मैंने कोशिश की है (डीबगिंग और समझने के लिए) खेतों के मूल्यों को बल देने के लिए afer patching और mysql में datetime फ़ील्ड ठीक हैं।

$intervention->starttime = date('Y-m-d H:i:s', strtotime($this->request->data['starttime'])); 
$intervention->endtime = date('Y-m-d H:i:s', strtotime($this->request->data['endtime']));

मदद के लिए धन्यवाद


एक लोकेल जागरूकता फैशन में तारीख / समय के मूल्यों को जाली / पार्स किया जा रहा है

अपडेट: 3.2.5 से पहले CakePHP एप्लिकेशन टेम्प्लेट संस्करणों के साथ यह डिफ़ॉल्ट व्यवहार है। 3.2.5 के रूप में लोकेल पार्सिंग अब डिफ़ॉल्ट रूप से सक्षम नहीं है, जिससे पार्सर को Ymd H:i:s डिफ़ॉल्ट की आवश्यकता होगी Ymd H:i:s इसके बजाय।

मार्शलिंग प्रक्रिया में, संबंधित कॉलम प्रकारों के अनुसार मूल्यों को "जाली" किया जा रहा है। DATETIME स्तंभों के लिए, यह \Cake\Database\Type\DateTimeType type class द्वारा किया जाता है

सटीक होने के लिए, यह \Cake\Database\Type\DateTimeType::marshall()

डिफ़ॉल्ट ऐप टेम्पलेट कॉन्फ़िगरेशन के साथ, DateTypeType को लोकेल जागरूक पार्सिंग का उपयोग करने के लिए कॉन्फ़िगर किया गया है, और चूंकि कोई डिफ़ॉल्ट लोकेल प्रारूप सेट नहीं किया जा रहा है, \Cake\I18n\Time::parseDateTime() मूल्यों को इसके डिफ़ॉल्ट "स्ट्रिंग फ़ॉर्मेट" के अनुसार पार्स करेगा ( Time::$_toStringFormat ), जो लोकेल के बारे में जागरूक है [IntlDateFormatter::SHORT, IntlDateFormatter::SHORT]

इसलिए, उदाहरण के लिए यदि आपके स्थान को en_US सेट किया गया है, तो मान को M/d/yy, h:mm a अपेक्षित स्वरूप के साथ पार्स किया जाएगा, जो कि आपका मान फिट नहीं होगा, और इसलिए आप अंत में समाप्त हो जाएंगे इकाई की संपत्ति के लिए null होने के साथ

पार्सर्स को उचित प्रारूप का उपयोग करें

tl; डॉ

यदि आपके ऐप में हर जगह jQuery विजेट का प्रारूप उपयोग नहीं किया जा रहा है, तो आप उदाहरण के लिए अस्थायी रूप से उचित लोकेल प्रारूप को सेट कर सकते हैं या लोकेल पार्सिंग को अक्षम कर सकते हैं

$dateTimeType = Type::build('datetime')->setLocaleFormat('yyyy/MM/dd HH:mm');

// ...
$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
// ...

$dateTimeType->setLocaleFormat(null);

या

$dateTimeType = Type::build('datetime')->useLocaleParser(false);

// ...
$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
// ...

$dateTimeType->useLocaleParser(true);

यह ध्यान दिया जाना चाहिए कि यह सभी दिनांक / समय इनपुट को प्रभावित करेगा, न कि केवल आपके starttime और endtime क्षेत्र!

क्या दूसरी ओर jQuery विजेट द्वारा उपयोग किया जाने वाला प्रारूप प्रारूप होना चाहिए, जिसे आप अपने ऐप के माध्यम से सभी तरह से उपयोग करना चाहते हैं, फिर डिफ़ॉल्ट स्वरूप को बदलना भी ऐसा कर सकता है

use Cake\I18n\Time;
Time::setToStringFormat('yyyy/MM/dd HH:mm');

अपने bootstrap.php नोट करें कि Time::setJsonEncodeFormat() और Time::$niceFormat जिसे आप भी संशोधित करना चाहते हैं

यह भी देखें

इसे मार्शलिंग से पहले इनपुट कन्वर्ट करें

एक और विकल्प होगा उदाहरण के लिए मार्शलिंग प्रक्रिया से पहले डेटा को Time उदाहरणों में कनवर्ट करें। यह पिछले उल्लिखित हल से संभावित समस्याओं से बचना होगा जो सभी इनपुट को प्रभावित करेगा।

आपके InterventionsTable क्लास में (एक व्यवहार या बाह्य श्रोता में भी रखा जा सकता है):

use Cake\Event\Event;
use Cake\I18n\Time;

...

public function beforeMarshal(Event $event, \ArrayObject $data, \ArrayObject $options)
{
    foreach (['starttime', 'endtime'] as $key) {
        if (isset($data[$key]) && is_string($data[$key])) {
            $data[$key] = Time::parseDateTime($data[$key], 'yyyy/MM/dd HH:mm');
        }
    }
}

यह भी देखें

कुकबुक> डेटाबेस प्रवेश और ORM> डेटा सहेजना> भवन निर्माण इकाइयां से पहले डेटा का संशोधित करें





cakephp-3.0