2013-07-05 9 views
7

से मिलीसेकंड, सेकंड, मिनट और घंटे को कैसे निकालें I समस्या में भाग गया जहां मैं दो तिथियों की तुलना करना चाहता था। हालांकि, मैं केवल वर्ष, महीना और दिन की तुलना करना चाहता था। और यह है कि मैं क्या के साथ कर सकते हैं:दिनांक

private Date trim(Date date) { 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.HOUR, 0); 
     return calendar.getTime(); 
    } 

मैं उपयोगकर्ता सभी इकाइयों, लेकिन कुछ दिनों, महीनों और वर्षों ट्रिम करने के लिए इस समारोह।

अब सवाल यह है कि आप इसके बारे में क्या सोचते हैं? क्या आपको ऐसा करने का कोई और तरीका पता है?

धन्यवाद

+2

मैं वास्तव में नहीं समझता कि समस्या कहां खड़ी है ?? –

+0

स्वच्छ कोड की तरह लगता है, डेट क्लास तक पहुंचने वाला कोई अन्य कोड बड़ा होगा, आप वास्तव में क्यों बदलेंगे। – SSpoke

+1

क्या उपयोगकर्ता का टाइमज़ोन आप प्लेटफ़ॉर्म के टाइमज़ोन के रूप में उसी के लिए आउटपुट उत्पन्न कर रहा है JVM चल रहा है? :) – Affe

उत्तर

2

मैं तुम्हें दो तिथियों जहां में आप केवल year, month और day तुलना करना चाहते हैं की तुलना करना चाहते ग्रहण।

आपने जो किया है वह ठीक है iee hour, minute, second और millisecond को हटा रहा है। आपको दोनों तिथियों के साथ ऐसा करना होगा।

एक बार ट्रिमिंग हो जाने के बाद आपको Date कक्षा में compareTo विधि का उपयोग करना होगा।

आप नीचे दिए गए कोड का उपयोग कर सकते हैं -

if(date1.compareTo(date2) < 0) { 
    // date1 is earlier 
} else if(date1.compareTo(date2) > 0) { 
    // date 2 is earlier 
} else { 
    // both dates are equal 
}  
+1

मुझे नहीं लगता कि मुझे वास्तव में इसकी आवश्यकता है। date1.forefore (date2) बेहतर लगता है। – Adelin

+1

यूप। मुझे आशा है कि मैं आपकी मदद कर रहा हूं। – JHS

6

आपका कोड काम करता है और पढ़ने के लिए आसान है। मुझे इसे बदलने के लिए कोई समस्या या कारण नहीं दिख रहा है।

+0

इसके लिए धन्यवाद। लेकिन, मैं कुछ जवाब ढूंढ रहा था जैसे "स्टीफन सी" उत्तर। – Adelin

4

अब सवाल यह है कि आप ऐसा करने की क्या बात करते हैं?

यह सरल और उचित दिखता है। आप एक नया Date और एक अस्थायी Calendar ऑब्जेक्ट बना रहे हैं, लेकिन यह केवल मामूली ओवरहेड है। (... जब तक आप इसका उपयोग बड़े डेटा संरचना को सॉर्ट/ऑर्डर करने के लिए नहीं कर रहे हैं ...)

आईएमओ, शायद इसे बदलने की कोई आवश्यकता नहीं है।

क्या आपको ऐसा करने का कोई और तरीका पता है?

  1. का विकास/एक Comparator<Date> कि केवल क्षेत्रों आप में रुचि रखते हैं का उपयोग करता है, उन्हें निकालने के लिए एक Calendar का उपयोग कर का उपयोग करें।

    चाहे यह मदद करेगा, इस पर निर्भर करता है कि आप वर्तमान में तुलना कैसे कर रहे हैं। एक तुलनित्र साफ हो सकता है। लेकिन फ्लिप-साइड यह है कि आप को बार-बार रूपांतरण कर सकते हैं, और Comparator<Date> आपको परिवर्तित तिथियों को कैशिंग करने के लिए कोई गुंजाइश नहीं देता है।

  2. Date.getTime() द्वारा दिए गए मानों का उपयोग करके गणना करें। मोटे तौर पर इस तरह:

    long val = date.getTime(); // milliseconds since 'epoch' in UTC 
    val = val + /* local timezone offset in milliseconds */ 
    long day = val/(1000 * 60 * 60 * 24); // days since "local" epoch. 
    
    // repeat for other Date, and compare the 'day' numbers as integers 
    

    स्पष्टीकरण, यह एक Calendar (या जो भी) का उपयोग की तुलना में कुछ साधारण अंकगणित करने के लिए और अधिक कुशल होना चाहिए। कोड थोड़ा अधिक अस्पष्ट है, लेकिन उचित गणित कौशल वाले किसी व्यक्ति के लिए स्पष्ट होना चाहिए।

+0

धन्यवाद, यह उत्तर वह है जिसे मैं ढूंढ रहा था। – Adelin

+0

दूसरा सुझाव डेलाइट बचत, या लीप सेकंड के लिए किसी भी बदलाव को ध्यान में रखता नहीं है। यह आपको बताएगा कि क्या दो तिथियां एक-दूसरे के 24 घंटों के भीतर थीं, जो आप 24 घंटे में मिलीसेकंड की संख्या की गणना करके अधिक आसानी से कर सकते थे। जब तक, यह विशेष रूप से आप जो चाहते हैं, उसके बाद बस अपने मौजूदा कोड का उपयोग करें जो पाठक को इसके इरादे के रूप में * अधिक * अधिक स्पष्ट है। – SimonC

+0

@ सिमोनसी - प्रासंगिक "कोड" वास्तव में एक टिप्पणी है। चाहे डेलाइट बचत समय (या नहीं) का खाता लेता है, इस पर निर्भर करता है कि आप इसे कैसे कार्यान्वित करते हैं। (लेकिन हाँ, यह चीजों को जटिल करता है।) मुझे पूरा यकीन है कि लीप-सेकंड अप्रासंगिक हैं। वे यूटीसी बेसलाइन समय को समायोजित करके काम करते हैं ... –

0

आप इस कोशिश कर सकते हैं, क्योंकि तारीखों के स्वरूपों तय रहना:

String first = date1.toString().substring(4,10) + " " + date.toString().substring(24, 28); 
    String second = date2.toString().substring(4,10) + " " + date.toString().substring(24, 28); 

जो होगा उत्पादन

दिसंबर 31 1969

जनवरी 06 1969

और फिर परिणामों की तुलना करें।

return (first.equals(second)); 

मुझे नहीं पता कि यह आपके विचार से बेहतर है, लेकिन आपको एक ही परिणाम मिलता है।

+1

यह केवल तभी काम करता है जब आप समानता की तिथियों की तुलना करना चाहते हैं। और यह वास्तव में अक्षम है ... और गैर-पोर्टेबल, क्योंकि यदि डिफ़ॉल्ट स्ट्रिंग स्वरूपण पर निर्भर करता है जो लोकेल विशिष्ट है। –

+0

उत्तर के लिए धन्यवाद, लेकिन अगर मैं (date1.before (date2)) उपयोगकर्ता को सक्षम नहीं कर सकता हूं ... :) – Adelin

8

क्या आपको वास्तव में java.util.Date का उपयोग करने की आवश्यकता है?

dateTime.dayOfMonth().roundFloorCopy() 

जो वास्तव में आपको क्या आवश्यकता है: आप joda time लिए स्विच कर सकते हैं, तो आप की तरह बहुत अच्छी सुविधाएं प्राप्त होंगी।

+0

यह एक तरह का उत्तर है जिसे मैं ढूंढ रहा था, हालांकि मेरी परियोजना छोटी है और मुझे इसकी आवश्यकता नहीं है अधिक निर्भरताओं को जोड़ने के लिए :) – Adelin

+0

जोडा आजकल मुख्यधारा का प्रकार है, इसलिए ऐसा नहीं है कि आपको कुछ अस्पष्ट लाइब्रेरी का उपयोग करने के बारे में चिंतित होना चाहिए ... कोई फर्क नहीं पड़ता कि परियोजना कितनी छोटी है, अगर आप कोई लॉगिंग करना चाहते हैं, तो आपको slf4j का उपयोग करना चाहिए , यदि आप परीक्षाएं लिख रहे हैं - testng, और यदि आप दिनांक/समय के बारे में चिंतित हैं, तो आपको जोदा (या उनके विकल्प, निश्चित रूप से - यहां एक धार्मिक युद्ध शुरू नहीं करना चाहते हैं) की आवश्यकता है। –

+0

आप भविष्य में सही हो सकते हैं मैं जोडा जोड़ूंगा – Adelin

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