2009-05-31 17 views
5

किसी दिए गए दिनांक से मुझे अपने दिन की आधी रात की गणना करने की आवश्यकता है। यहां मैं क्या आया था। यह इतना बदसूरत है कि मुझे लगता है कि एक बेहतर तरीका होना चाहिए।किसी दिनांक को दिए गए दिन की गणना

private Date day(Date creation) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(creation); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    return calendar.getTime(); 
} 

सुझाव?

केंट

+3

अच्छा प्रभु - पहले एलन Kay, अब केंट बैक। तो यह जगह है ... – duffymo

+0

इससे भी बदतर है, आपके द्वारा पोस्ट किया गया कोड समय क्षेत्र के लिए खाता नहीं है, जिसे आप परवाह नहीं कर सकते हैं या नहीं। – Yishai

+0

सरल इसे जांचें [यहां] (http://developer-dot-android.blogspot.com/2012/03/date-into-day-tutorial.html) –

उत्तर

7

आपको अंतर्निहित दिनांक API अप्रचलित पर विचार करना चाहिए। इसके बजाय जोडा तिथि और समय एपीआई का उपयोग करें।

यहां आपकी विधि के लिए एक ड्रॉप-इन प्रतिस्थापन है।

public static void main(String[] args) { 
    final Date creation = new Date(); 
    final Date midnight = new Foobar().day(creation); 
    System.out.println("creation = " + creation); 
    System.out.println("midnight = " + midnight); 
} 

उत्पादन होता है:

creation = Sun May 31 10:09:38 CEST 2009  
midnight = Sun May 31 00:00:00 CEST 2009 
2

आप स्थानीय समय के लिए देख रहे हैं, कि सबसे अच्छा आप प्राप्त करने के लिए जा रहे हैं। और यद्यपि आप इसे बदसूरत मान सकते हैं, दृश्यों के पीछे बहुत कुछ चल रहा है (संभावित रूप से)।

आप आधी रात यूटीसी चाहते हैं, निम्नलिखित काम करेगा:

public static void main(String[] argv) 
throws Exception 
{ 
    final long MILLIS_PER_DAY = 24 * 3600 * 1000L; 

    long midnightUTC = (System.currentTimeMillis()/MILLIS_PER_DAY) * MILLIS_PER_DAY; 
} 

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

5

JODA लाइब्रेरी पर किसी अन्य निर्भरता की लागत पर बेहतर समाधान हो सकता है। मैं इसे DateMidnight property देख रहा हूं। मुझे खेद है कि मैं अधिक आधिकारिक रूप से उत्तर नहीं दे सकता, लेकिन मैं खुद एक जोडा उपयोगकर्ता नहीं हूं।

0

मुझे लगता है कि आप इस कोड को काफी बेहतर बनाने के लिए एकमात्र तरीका प्रतिनिधित्व में बदलाव से हैं। उदाहरण के लिए,

  • Calendrical Calculations में नाचम डेर्शोवित्ज़ और एड Reingold से समझाया "पूर्ण तिथि" प्रणाली द्वारा दिन का प्रतिनिधित्व करते हैं।

  • मध्यरात्रि से सेकंड की गणना करके समय का प्रतिनिधित्व करें। या यदि आपको उप-दूसरे रिज़ॉल्यूशन की आवश्यकता है, तो मिलीसेकंड गिनें।

अपने संक्षिप्त उदाहरण से मैं बता नहीं सकता अपने कार्यक्रम में क्या बिंदुओं पर आप मौजूदा Date और Calendar वर्गों के साथ संगत होना करने की जरूरत है, या यदि आप एक saner प्रतिनिधित्व का उपयोग कर एक उपयोगी उपवर्ग बना सकते हैं।

0

थोड़ी देर में जावा प्रोग्राम नहीं किया है, लेकिन आप इस set method को वर्ष, महीने और दिन के लिए वर्तमान मानों में गुजरने में सक्षम हो सकते हैं। हालांकि थोड़ा करीब पढ़ने से, आपको पहले स्पष्ट कॉल करना पड़ सकता है। यह आपकी वर्तमान विधि का उपयोग करने से कम वर्बोज़ हो सकता है या नहीं भी हो सकता है।

1

JODA यदि आप गंभीर कैलेंडर की जरूरत है जाने के लिए, कम से कम जब तक JSR-310 में हो जाता है जिस तरह से है

private Date day(Date creation) { 
    return new DateMidnight(creation).toDate(); 
} 

यहाँ एक साधारण परीक्षण है जेडीके (1.7 शायद, यदि नहीं 1.8)।

कहा जा रहा है कि, इस कोड को थोड़ा अच्छा बनाने के लिए कुछ चीजें की जा सकती हैं।

import static java.util.Calendar.*; 

... 

private static final List<Integer> TIME_FIELDS = 
    Arrays.asList(HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND); 

private Date day(Date creation) { 
    Calendar c = getInstance(); 
    c.setTime(creation); 
    for(int field : TIME_FIELDS) c.set(field, 0); 
    return c.getTime(); 
} 

इससे कोई प्रदर्शन पुरस्कार नहीं मिलेगा। आप विशिष्ट फ़ील्ड मानों पर भरोसा करने के लिए मानक कर सकते हैं (कैलेंडर क्लास में FIELD_COUNT फ़ील्ड प्रकार का अर्थ है कि आप ऐसा कुछ कर सकते हैं) लेकिन यह जेडीके कार्यान्वयन और संस्करणों के बीच मुद्दों को जोखिम देता है।

0

यह मूल रूप से पोस्ट किए गए कोड का पूरक है। यह कैलेंडर वैरिएबल में वर्ष, महीना और दिन के अलावा सब कुछ साफ़ करने के बजाय, एक नए ग्रेगोरियन कैलेंडर ऑब्जेक्ट में वर्ष, महीना और दिन सेट करता है। यह एक सुधार में ज्यादा नहीं है, लेकिन मुझे लगता है कि यह कहने के लिए स्पष्ट है कि आप कौन से फ़ील्ड कॉपी कर रहे हैं, इसके बजाय आप किन फ़ील्ड को अनदेखा कर रहे हैं।

public Date day(Date creation) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(creation); 
    return new GregorianCalendar(
      calendar.get(Calendar.YEAR), 
      calendar.get(Calendar.MONTH), 
      calendar.get(Calendar.DAY_OF_MONTH)).getTime(); 
} 

व्यक्तिगत रूप से, मुझे लगता है कि मैं दूसरों द्वारा प्रस्तावित जोडा लाइब्रेरी के साथ जाऊंगा।

1

date4j पुस्तकालय का उपयोग करना:

DateTime start = dt.getStartOfDay(); 
संबंधित मुद्दे