2010-07-21 9 views
25

मैं काम पर कुछ कोड की समीक्षा करने और में कैसे कोड को वर्तमान समय पर 1 सप्ताह जोड़ने संभालती कोई विसंगति में आए और अगर कोई कारण है कि वास्तव में एक दूसरे के ऊपर प्राथमिकता दी जानी चाहिए था सोच रहा था कर रहा हूँ:एक तिथि में 1 सप्ताह जोड़ें, किस तरह से पसंद किया जाता है?

पहले

public static Date addDaysToDate(final Date date, int noOfDays) { 
    Date newDate = new Date(date.getTime()); 

    GregorianCalendar calendar = new GregorianCalendar(); 
    calendar.setTime(newDate); 
    calendar.add(Calendar.DATE, noOfDays); 
    newDate.setTime(calendar.getTime().getTime()); 

    return newDate; 
} 

और दूसरा इस्तेमाल किया सरल मिलीसेकंड गणित: एक उपयोगिता विधि थी

long theFuture = System.currentTimeMillis() + (86400 * 7 * 1000); 
Date nextWeek = new Date(theFuture); 

दूसरी विधि स्पष्ट रूप से उपयोग करता है 'जादू संख्या' एक सप्ताह परिभाषित करने के लिए है, लेकिन इस कदम हो सकता है डी को स्थिर MILLISECONDS_IN_ONE_WEEK = 86400 * 7 * 1000 तो इसके अलावा, क्या कोई कारण है कि इन तरीकों में से किसी एक को दूसरे पर क्यों प्राथमिकता दी जानी चाहिए?

असल में मैं कोड को लगातार समेकित करना चाहता हूं, लेकिन मुझे पूरी तरह से यकीन नहीं है कि कौन सा निकालना है। तो किसी भी तर्क एक तरह से या दूसरा उपयोगी होगा।

+2

* खांसी * जोडा-टाइम का उपयोग करें। डेटटाइम newDate = date।plusWeeks (1); ' – ColinD

+7

कोड विंडोज 1.2 पर बड़े पैमाने पर जेवीएम का उपयोग कर विंडोज मोबाइल डिवाइस पर चलाया जाता है। जोडा का परीक्षण केवल 1.4 और उसके बाद किया गया है, इसलिए मैं एक थर्ड पार्टी लाइब्रेरी नहीं जोड़ना चाहता हूं जिसे वास्तव में प्लेटफ़ॉर्म पर चलाने के लिए डिज़ाइन नहीं किया गया था। लेकिन सुझाव के लिए धन्यवाद। – DaveJohnston

उत्तर

22

दो विधियां डेलाइट बचत सीमाओं पर अलग-अलग व्यवहार करेंगे।डेलाइट बचत स्थिति के बावजूद, पहली विधि दिन के उसी समय लौटती रहेगी। दूसरी विधि समय लौटाएगी जो प्रत्येक दिशा में एक घंटे अलग-अलग होती है क्योंकि डेलाइट बचत समय शुरू होता है और बंद हो जाता है।

0

अधिक सामान्य, यह अधिक उपयोगी होगा। यदि आप हमेशा एक सप्ताह जोड़ते हैं, तो मैंने दूसरी विधि चुना होगा। यदि आपके पास अलग-अलग जोड़े हैं, तो मैंने पहले व्यक्ति को चुना होगा, शायद आवश्यक होने पर सेकंड या यहां तक ​​कि मिली के लिए दिन बदलना।

0

पहला धीमा होगा, इसलिए यदि प्रदर्शन एक मुद्दा है, तो दूसरा बेहतर होगा।

+0

यह विंडोज मोबाइल डिवाइस पर चलाया जाता है, इसलिए प्रदर्शन निश्चित रूप से एक चिंता है। आपको लगता है कि इसका कितना प्रभाव होगा (मोटे तौर पर)? – DaveJohnston

+0

निर्भर करता है कि इसे कितनी बार कहा जाता है, उस तरह की चीज। एक विचार रखने के लिए आपको इसे प्रोफाइल करने की आवश्यकता होगी। उदाहरण के तौर पर, कुछ समय में महत्वपूर्ण कोड को मुझे देखना था, हम लगातार "नई तिथि()। GetTime()" को कॉल कर रहे थे - "System.currentTimeMillis()" के साथ इसे बदलकर महत्वपूर्ण अंतर आया क्योंकि हम नहीं थे बार-बार तारीख वस्तुओं को तुरंत चालू करना। – Rich

+3

"धीमा हो जाएगा" सुंदर व्यक्तिपरक है। कैलेंडर और डेट फ़ील्ड मैनिपुलेशन वैसे भी तारीख के अंतर्निहित 'लंबे' प्रतिनिधित्व को बदलने के बारे में है, जिसका अर्थ है कि "धीमा" नीचे आता है कि ऑब्जेक्ट्स बनाना कितना तेज़ है - जो ज्यादातर लोगों के विचार से बहुत तेज़ है। –

1

सबसे पहले और सबसे महत्वपूर्ण, मैं तर्क दूंगा कि आप इसे जोडाटाइम से बदल दें। http://joda-time.sourceforge.net/ यह एक बहुत अच्छा समय पुस्तकालय है। आप इस पृष्ठ को देखना चाहते हैं कि किसी विशेष बिंदु पर दिन या सप्ताह जोड़ना कितना आसान है: http://joda-time.sourceforge.net/key_period.html ऐसा नहीं कर सकता, असंगत JVM के साथ मोबाइल डिवाइस। ओह।

आपका पहला उदाहरण पढ़ने के लिए आसान है और आपके डेवलपर्स द्वारा उपयोग करना आसान होगा। यह कैलेंडर कक्षाओं का भी उपयोग करता है जो जावा में तिथियों में हेरफेर करने का आम तौर पर स्वीकार्य तरीका है। इससे बेहतर क्या होता है कि इसमें एक स्पष्ट विधि नाम है जो इसके लिए अपेक्षा करता है।

तो यदि आप लगातार अपने कंप्यूटर को com.DaveJ.util.date.DateUtils.addDaysToDate (अंतिम दिनांक दिनांक, int noOfDays) का उपयोग करने के लिए दोबारा उपयोग करते हैं तो आप उस विधि के अंदर जो कुछ भी चाहते हैं, कर सकते हैं, चाहे वह कैलेंडर या मिलिस या जोडा हो , और अपने आवेदन के भीतर संगत हो। इसके लिए कुछ यूनिट परीक्षण लिखना न भूलें!

+0

एक और जवाब ने गति का उल्लेख किया। यदि आपके पास एक विधि में इस तर्क को समाहित किया गया है, तो एक ही स्थान पर, इसे बेंचमार्क करना बहुत आसान होगा और इसे आवश्यकतानुसार गति के लिए ट्यून करना होगा। – Freiheit

0

यह निर्भर करता है! लीप सेकंड, डीएसटी और अन्य कैलेंडर विषमता के कारण, दोनों हमेशा बराबर नहीं होते हैं।

व्यवसाय के लिए और हर दिन उपयोग के लिए, हमेशा पहली विधि का उपयोग करें और प्रदर्शन बिल्कुल खराब नहीं है। यह आपके लिए उन चीजों को संभालेगा।

वैज्ञानिक आवश्यकताओं के लिए, अक्सर आपको एक मोनोटोन घड़ी (यहां दूसरा स्थान) का उपयोग करना पड़ता है।

0

डेलाइट सेविंग टाइम में बदलाव होने पर दो विधियां अलग-अलग परिणाम दे सकती हैं। कल्पना करें कि वर्तमान समय 23:50 है और 02:00 बजे घड़ी 03:00 तक पहुंच जाती है। जब आप मिलीसेकंड में 7 दिन जोड़ते हैं तो अगले दिन 00:50 होगा। 7 दिनों के जोड़, परिणामी समय अभी भी 23:50 होगा।

भ्रम को पूरा करने के लिए, आप add(Calendar.WEEK_OF_YEAR, 1) को भी आजमा सकते हैं, यह सुनिश्चित नहीं कर सकते कि यह अलग-अलग कैसे होगा।

0

चूंकि आप इसे मोबाइल डिवाइस पर उपयोग कर रहे हैं, तो पहली विधि बेहतर है। इसका कारण यह है कि आपका कोड विशिष्ट कैलेंडर, डीएसटी और अन्य समस्याओं से स्वतंत्र होना चाहिए, जैसे सेकेंड ओवररन (लीप सेकंड)।

आपको GregorianCalendar पर निर्भरता को हटाना होगा और Calendar.getInstance() का उपयोग करके इसे बनाना होगा।

+0

इस मामले में आप वास्तव में 'getInstance()' का उपयोग नहीं करते हैं। मैं अनुमान लगा रहा हूं कि कोड ग्रेगोरियन कैलेंडर के अनुसार भविष्य में 1 सप्ताह की गणना करने की कोशिश कर रहा है, भविष्य में एक हफ्ते उपयोगकर्ता के स्थानीय कैलेंडर के अनुसार नहीं। हालांकि उपयोगकर्ता फ्रांसीसी क्रांति से दशमलव कैलेंडर का उपयोग क्यों करेगा, मुझे कोई जानकारी नहीं है। –

3

दूसरे दिन caught me out विधि विधि का उपयोग करने के बारे में बहुत सावधान रहें। पर विचार करें

private static long ONE_YEAR_AS_MILLISECONDS = 365*24*60*60*1000; 

यह पर्याप्त मासूम लग रहा है, लेकिन वास्तव में उत्पादन नहीं होगा क्या आशा की जाती है के रूप में गुणा पूर्णांकों, जो जब एक दूसरे को पूर्णांकों से गुणा, एक अंकीय अतिप्रवाह का कारण बनता है का उपयोग करता है और एक अप्रत्याशित परिणाम मिलेगा। ऐसा इसलिए है क्योंकि जावा में अधिकतम int मान 2,147,483,647 है और फिर भी एक वर्ष में 31,536,000,000 एमएस हैं। मेरी मशीन पर उपर्युक्त कोड 1,471,228,928 उत्पन्न करता है जो स्पष्ट रूप से सही नहीं है।

इसके बजाय यदि आप ऐसा करने की जरूरत है:

private static long ONE_YEAR_AS_MILLISECONDS = 365L*24L*60L*60L*1000L; 
3

नीचे जावा 8 में किया जा सकता, जावा 8 चट्टानों !!

public static void main(String[] args) { 
     LocalDate today = LocalDate.now(); 
     System.out.println("Current date: " + today); 

     //add 1 week to the current date 
     LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); 
     System.out.println("Next week: " + nextWeek); 
    } 
+0

एक ही प्रभाव के साथ 'ChronoUnit' को छोड़कर छोटा सरल कोड:' today.plusWeeks (1) ' –

+0

मैं हमेशा 'समय' विधि में समय क्षेत्र (' ZoneId') पास करने का सुझाव देता हूं। यदि आपका JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र छोड़ा गया है तो यह निश्चित रूप से लागू होता है। यह ऐप आपके ऐप के निष्पादन के दौरान भी * भिन्न हो सकता है! समय क्षेत्र महत्वपूर्ण है क्योंकि किसी भी क्षण के लिए तिथि दुनिया भर में बदलती है। 'लोकलडेट.नो (जोनआईडी.ओफ़ (" अमेरिका/मॉन्ट्रियल "))' –

0

दिनांक-केवल मूल्य के लिए, the Answer by javaHelper देखें। LocalDate वर्ग का उद्देश्य जानबूझकर समय-समय पर और कोई समय क्षेत्र नहीं है।

ZonedDateTime

दिनांक-समय मूल्य के लिए, ZonedDateTime का उपयोग इस तरह के डेलाइट सेविंग टाइम (डीएसटी) के रूप में विसंगतियों के लिए खाते में करने के लिए एक समय क्षेत्र के साथ-साथ एक तारीख और एक समय दिन-का-प्रतिनिधित्व करने के लिए।

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime now = ZonedDateTime.now(zoneId); 
ZonedDateTime weekLater = now.plusWeeks(1); 

या कुछ मनमाना दिनों को जोड़ें।

ZonedDateTime later = now.plusDays(someNumberOfDays); 

java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं पुरानी परेशानी वाली डेट-टाइम कक्षाएं जैसे java.util.Date, .Calendar, & java.text.SimpleDateFormat प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, जावा.टाइम पर माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें।

java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा जाता है और आगे ThreeTenABP में Android के लिए अनुकूलित।

ThreeTen-Extra प्रोजेक्ट अतिरिक्त कक्षाओं के साथ जावा.टाइम बढ़ाता है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है।

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