2012-02-17 14 views
9

हम दिनांक वस्तु के रूप में तारीख और डेटाटाइम संग्रहित कर रहे हैं।कैसे बताएं कि java.util.Date ऑब्जेक्ट में समय का हिस्सा है या नहीं?

लेकिन, देर से, हमें यह बताने में सक्षम होना चाहिए कि डेट ऑब्जेक्ट दिनांक या डेटाटाइम है या नहीं।

05/18/05 00:00:00 और 05/18: 05 दोनों में घंटा/मिनट का हिस्सा होता है। मैं वास्तव में उन्हें अलग नहीं बता सकता।

+0

जिज्ञासा से, क्या जावा के पास अलग-अलग दिनांक स्वरूपों की तुलना करने का कोई तरीका नहीं है? यह .NET में मामूली रूप से आसान है। – Jason

+0

'कैलेंडर सी = कैलेंडर.getInstance(); तिथि एक्स; // कुछ डेटा ' ' c.setTime (x) से भरा; c.get (calendar.YEAR) // या फ़ील्ड जिसे आप चाहते हैं ' –

+0

@ जावा में "जेसन" दिनांक प्रारूप "प्रतिपादन/पार्सिंग के लिए हैं। तिथियां 1 9 70 से सिर्फ एक लपेटी लंबी मिलिस हैं, जिनकी तुलना आप कर सकते हैं। तिथियों में प्रारूप नहीं है - वे डेटफॉर्मेट ऑब्जेक्ट द्वारा स्वरूपित होते हैं। – Bohemian

उत्तर

3

एक java.util.Date वास्तव में, समय में एक बिंदु है, तारीख नहीं है, इसलिए इसे केवल दिनांक के रूप में उपयोग करने का कोई तरीका नहीं है। आपको एक अलग दृष्टिकोण के साथ आने की आवश्यकता होगी।

+0

होना चाहिए। दृष्टिकोण त्रुटिपूर्ण है। हमें तिथि और डेटाटाइम के लिए अलग-अलग वस्तुएं रखने की आवश्यकता है। – thinkanotherone

+0

मुझे विश्वास नहीं है कि यह सबसे अच्छा जवाब के रूप में चिह्नित किया गया था। यह कोई समाधान नहीं है, सिर्फ एक राय – FiruzzZ

0

आप संभवतः सत्यापन के लिए Google's DateTime लाइब्रेरी का उपयोग कर सकते हैं।

इसमें parseDateTime और parseDate विधियां हैं जो संख्याफॉर्मेट अपवाद को फेंक देंगे अगर उन्हें सही रूप से प्रारूपित नहीं किया गया है।

फिर, तुम कर सकते हो ...

try { 
    DateTime someVar = DateTime.parseDate("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date... 
} 

try { 
    DateTime someVar = DateTime.parseDateTime("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date/time... 
} 
+0

आपको प्रवाह नियंत्रण के लिए अपवादों का उपयोग करने से बचना चाहिए! – Bohemian

+0

@ बोहेमियन - हुह? क्यों नहीं? –

+0

वास्तव में, जब उपयोगकर्ता इनपुट (यानी वेब फॉर्म पर टेक्स्ट बॉक्स) के साथ काम करते हैं, जहां आपको सत्यापित करने की आवश्यकता होती है कि उपयोगकर्ता ने एक तिथि सही तरीके से आपूर्ति की है, तो उनके आपूर्ति किए गए इनपुट पर पार्सर का उपयोग करने का एकमात्र तरीका होगा इसे सत्यापित करने के बारे में पता है ... –

0

मैं समझता हूँ कि आप वास्तव में java.sql.Date और java.sql.Timestamp उदाहरणों एक JDBC ResultSet से प्राप्त के रूप में साथ काम कर रहे हैं, जबकि वे, सही उनके सुपर क्लास java.util.Date के खिलाफ घोषित कर रहे हैं?

उस स्थिति में, बस instanceof का उपयोग करें।

if (date instanceof java.sql.Date) { 
    // It was originally a DATE. 
} else if (date instanceof java.sql.Timestamp) { 
    // It was originally a TIMESTAMP (DATETIME). 
} 
5

जब तक आपकी datetimes आधी रात में नहीं हो, यानी वे 00:00:00 की HH:mm:ss कभी नहीं की गारंटी है, वहाँ "तिथियों" और datetimes कि आधी रात में अलग होने के लिए होता है बताने के लिए कोई ठोस तरीका है।

अपने datetimes आधी रात को कभी नहीं कर रहे हैं, तो:

if (new SimpleDateFormat("HH:mm:ss").format(object).equals("00:00:00")) 

अगर Date वस्तु एक "तिथि" है निर्धारित करने के लिए क्या करना होगा।

मुझे लगता है कि आपका डिज़ाइन त्रुटिपूर्ण है और आपको एक और समाधान मिलना चाहिए। मुझे यह भी लगता है कि Date वर्ग का नाम त्रुटिपूर्ण है और इस तरह के भ्रम का कारण बनता है।

+0

'00:00:00" .equals (नया SimpleDateFormat ("एचएच: मिमी: एसएस")। प्रारूप (ऑब्जेक्ट)); ' – rptmat57

+0

@ आरपीटी आपका मुद्दा क्या है? – Bohemian

+0

दूसरी तरफ स्ट्रिंग अक्षर रखने के लिए बस बेहतर अभ्यास। हालांकि मुझे नहीं लगता कि प्रारूप विधि कभी भी शून्य – rptmat57

0

हालांकि मैं कच्चे समय के मूल्य को संशोधित करने के संबंध में यहां दिए गए समाधानों से सहमत हूं, यह देखने के लिए कि क्या इसमें समय का हिस्सा है, क्योंकि दिमित्री ने कहा था कि दोष यह है कि Date मूल्य में मध्यरात्रि का समय हिस्सा होता है, तो कोई रास्ता नहीं है बताने के लिए।

तो, थोड़ी देर बाद सोचकर, आप संभवतः अपनी खुद की कक्षा बना सकते हैं जो Date तक फैला है जिसमें एक सदस्य परिवर्तनीय बूलियन है जिसे "isDateTime" कहा जाता है। फिर, जब आप शुरुआत में अपनी तिथि या डेटाटाइम वैल्यू में लोड करते हैं, तो उस बूलियन को सही या गलत पर सेट करें कि यह डेटाटाइम है या नहीं।

3

का उपयोग अपाचे कॉमन्स-लैंग-3:

DateUtils.truncate(fecha, Calendar.DAY_OF_MONTH).equals(fecha) 
1

पार्सिंग के लिए कोई ज़रूरत नहीं, स्वरूपण या 3 पार्टियों पुस्तकालयों। आप आसानी से कर सकते हैं:

Calendar c = ... 
c.setTime(date); 
//this doesn't care about nanos 
if(c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) > 0) { 
.... 
} 

पीडी: मैं 1000-1025 के साथ ऐसा कर।000 ऑब्जेक्ट्स और प्रदर्शन को खतरे में नहीं लग रहा है, लेकिन निश्चित रूप से यह इस बात पर निर्भर करेगा कि आप यह कहां और क्यों करना चाहते हैं

+0

क्या यह दृष्टिकोण अधिक प्रभावी है या समय भाग को 'स्ट्रिंग' के रूप में तुलना करता है, कैसे _Bohemian_ वर्णित है? – dk7

+1

जैसा कि मैंने कहा था, इस "दृष्टिकोण" को SimpleDateFormat की आवश्यकता नहीं है (जो एक ** सस्ता ऑब्जेक्ट ** नहीं है यदि आप तुलनात्मक रूप से तुलना करेंगे तो), एसडीएफ भी थ्रेड सुरक्षित नहीं है, इसलिए निर्भर करता है संदर्भ (बहु-धागा) यह असफल हो सकता है और कुछ और कारण जो विषय से दूर हैं – FiruzzZ

संबंधित मुद्दे