2012-10-05 7 views
7

में स्ट्रिंग से डेटटाइम ऑब्जेक्ट कैसे बनाएं डीबी तालिका में मेरे पास फ़ील्ड प्रकार के रूप में datetime के साथ कई फ़ील्ड हैं। तो मुझे केवल दिनांक समय वस्तु के रूप में डेटा जारी रखने की आवश्यकता है।symfony2/php

एक रूप से मैं दिनांक समय के रूप में

2012-10-05 17:45:54 

अब की तरह स्ट्रिंग जब मैं त्रुटि निम्न मिल कभी मैं अपने इकाई जारी रहती है:

Fatal error: Call to a member function format() on a non-object in ..\DateTimeType.php on line 44

मैं

$protocol->setStartedAt(strtotime($post['started_at'])); 

साथ करने की कोशिश की या

$from = \DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']); 
$protocol->setStartedAt($from); 

या सिर्फ

$from = new \DateTime($post['started_at']); 
$protocol->setStartedAt($from); 

पिछले कोड काम करता है, लेकिन यह टाइमस्टैम्प तर्क के रूप में पारित का उपयोग करता है नहीं करता, लेकिन सिर्फ वर्तमान समय हो जाता है।

कोई विचार?

+0

क्या आप सुनिश्चित हैं कि '$ post [' start_at ']' क्या आप इसे चाहते हैं? क्या यह '$ _POST ['start_at']' नहीं है? –

+0

इसके अलावा, 'डेटटाइम' ऑब्जेक्ट और विधियां त्रुटियों पर अपवाद फेंकती हैं। क्या आप उनमें से कोई नहीं मिला? 'कोशिश/पकड़' का उपयोग करने का प्रयास करें। –

उत्तर

12

मैं हमेशा अपने निर्माता के साथ दिनांक समय वस्तु बनाने, अपने मामले में ओएस यह होगा:

$protocol->setStartedAt(new \DateTime($post['started_at'])); 

अगर यह काम करता है, लेकिन टाइमस्टैम्प आप शायद कर तैनात उपयोग नहीं करता है $ post ['start_at'] में मान नहीं है। यह debuging प्रयास करें या बस गंदा चाल कार्य करें:

die($post['started_at']); 
+0

अधिक डिबगिंग: 'var_dump'' new dateTime() 'का परिणाम यदि अधिक जानकारी के लिए यह गलत उपयोग 'var_dump (\ DateTime :: getLastErrors()) है। http://php.net/manual/en/datetime.getlasterrors.php – yoshi

+0

बैकस्लैश क्यों? तो सिम्फनी इसका व्याख्या नहीं करता है? – meles

+0

आप दिनांक '' 'उपयोग'' कथन के साथ डेटटाइम जोड़ सकते हैं, फिर बैकस्लैश की आवश्यकता नहीं होगी। अन्यथा आपको कक्षा के लिए पूर्ण पथ घोषित करना होगा, इस मामले में यह डिफ़ॉल्ट नामस्थान में है, इसलिए केवल बैकस्लैश की आवश्यकता थी। –

1

createFromFormat कैसे बनाएं?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s'); 
+0

क्षमा करें, सिर्फ देखा है कि आपके पास पहले से ही यह है - यह काम नहीं कर रहा है क्योंकि प्रारूप गलत दिखता है। अपने प्रारूप को ठीक से मिलान करने के लिए लिंक किए गए पृष्ठ का उपयोग करने का प्रयास करें - यह PHP के प्रारूप में है, अजीब सिम्फनी नहीं ... – watermanio

+0

नहीं, अभी भी यह त्रुटि प्राप्त करें, किसी गैर-ऑब्जेक्ट DateTimeType.php लाइन पर किसी सदस्य फ़ंक्शन प्रारूप() पर कॉल करें 44 –

+0

उपरोक्त समाधान गलत है। सही समाधान = '$ से = \ DateTime :: createFromFormat ('Ymd H: i: s', $ post ['start_at']);' –

8

भविष्य पाठकों को निश्चित रूप से किसी दिन इस समस्या का सामना करेंगे रखने के लिए (यह पहली पोस्ट है अगर आप गूगल "स्ट्रिंग से सिम्फोनी 2 datetime"), ध्यान रखें कि सिम्फनी 2 में डेटटाइम ऑब्जेक्ट उस प्रारूप के साथ एक स्ट्रिंग स्वीकार नहीं करता है: "d/m/Y H:i:s", और शायद कई अन्य लोगों का समर्थन नहीं करता है।

बनने नहीं है कि कम से पागल के लिए, मैं वास्तव में पता चला है कि सबसे आसान व सुरक्षित समाधान ऐसी त्रुटियों से बचने के लिए इस एक है:

पहले, जो कुछ भी से स्ट्रिंग के लिए अपनी तिथि पाने आप जिस तरह का अनुरोध कर रहे हैं (मेरे मामले में एक सामान्य AJAX अनुरोध) और इसे डेटटाइम ऑब्जेक्ट में परिवर्तित करें, यह उदाहरण मानता है कि हमें 25/04/2015 15:00 के लिए डेटटाइम ऑब्जेक्ट बनाने की आवश्यकता है, जो कि jQuery UI italian DateTimePicker का प्रारूप है (यह सिर्फ एक उदाहरण है):

$literalTime = \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00"); 

(ध्यान दें: \ का उपयोग php के दिनांक समय वस्तु का उपयोग करने, और आप Symfony के datetime उद्देश्य यह है कि आप एक अपवाद फेंक देते हैं का उपयोग किया जाएगा)

फिर, एक बार आप इसे किया था, एक दिनांक स्ट्रिंग आराम का उपयोग कर बनाने के प्रारूप समारोह, पहले पैरामीटर उत्पादन प्रारूप की उम्मीद (Y-m-d H:i:s) देकर:

$expire_date = $literalTime->format("Y-m-d H:i:s"); 

इस तरह आप 100% यकीन है कि जो कुछ भी तरह प्रारूप का आप गुजर रहे हैं या प्राप्त करने के लिए इस ठीक से conve हो जाएगा कि कर रहे हैं rted और आपको डेटटाइम सिम्फनी ऑब्जेक्ट, से किसी भी तरह का अपवाद नहीं मिलेगा जब तक कि आप इनपुट इनपुट के रूप में अपेक्षा करते हैं।

यह जानकर कि यह पोस्ट वास्तव में काफी पुराना है, मैंने अभी इसे पोस्ट करने का फैसला किया है क्योंकि मुझे कोई अन्य मूल्यवान स्रोत नहीं मिला है, लेकिन यह समझने के लिए कि समस्या कहां हो सकती है।

कृपया ध्यान दें कि सबसे अच्छा समाधान अभी भी सही प्रारूप में डेटाटाइम स्ट्रिंग को भेजने के लिए है, लेकिन यदि आपके पास सचमुच ऐसा करने का कोई तरीका नहीं है तो इस तरह की स्ट्रिंग को बदलने का सबसे सुरक्षित तरीका उपर्युक्त है।