2010-02-14 10 views
26

मेरे एपीआई पुस्तकालय ग्राहक दिनांक पारित करने के लिए अनुमति देता है के शुरू करने के लिए दिनांक समय सेट महीने में शामिल हैं।Joda समय में, महीने के

अब, पास की तारीख आमतौर पर नई तिथि() - जिसका अर्थ वर्तमान तत्काल है। मेरी समस्या वास्तव में महीने की शुरुआत में नई डेटमिडनाइट (jdkDate) उदाहरण स्थापित कर रही है।

क्या कोई Joda-Time के साथ इस उपयोग के मामले को प्रदर्शित कर सकता है? चालू माह के पहले दिन की शुरुआत में

+0

से हटाएं प्रश्न शीर्षक में जोडा समय का उल्लेख होना चाहिए। –

+0

यह करता है "क्या कोई व्यक्ति जोडा-टाइम के साथ इस उपयोग के मामले को प्रदर्शित कर सकता है।" मैंने यह और स्पष्ट करने के लिए एक और नोट जोड़ा है कि यह एक जोडा समय प्रश्न है। –

+0

@ मैक्सिम वेक्स्लर लचलन रोश ने कहा * शीर्षक * जोडा-टाइम का जिक्र करना चाहिए। मैंने संपादन किया। –

उत्तर

41

आधी रात द्वारा दिया जाता है:

// first midnight in this month 
DateMidnight first = new DateMidnight().withDayOfMonth(1); 

// last midnight in this month 
DateMidnight last = first.plusMonths(1).minusDays(1); 

तो एक java.util.Date से शुरू, एक अलग DateMidnight निर्माता प्रयोग किया जाता है:

// first midnight in java.util.Date's month 
DateMidnight first = new DateMidnight(date).withDayOfMonth(1); 

जोडा समय जावा दस्तावेज़ - http://joda-time.sourceforge.net/api-release/index.html

+0

बीटीडब्ल्यू, उस पर "आखिरी" क्यों नहीं: दिनांक मध्यरात्रि आखिरी = first.plusMonths (1) .minusDays (1); वही बात, बस क्लीनर। –

+1

यह उत्तर सही था, लेकिन अब बाहर निकाला गया है। हर बार क्षेत्र में हर दिन मध्यरात्रि नहीं होता है। जोडा-टाइम 2 ने "मध्यरात्रि के स्थान पर उपयोग करने के लिए एक विधि [' withTimeAtStartOfDay'] (http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) का उपयोग किया " विशेषताएं। –

+0

डेटमिडनाइट अब बहिष्कृत है। जावाडॉक से: "मध्यरात्रि का समय कुछ समय क्षेत्रों में मौजूद नहीं है, जहां डेलाइट सेविंग टाइम अगली शिफ्ट मध्यरात्रि के घंटे को छोड़ देती है। समय क्षेत्र के बिना दिनांक का प्रतिनिधित्व करने के लिए लोकलडेट का उपयोग करें या पूर्ण तिथि और समय का प्रतिनिधित्व करने के लिए डेटटाइम का उपयोग करें, शायद एक दिन की शुरुआत में तत्काल प्राप्त करने के लिए DateTime.withTimeAtStartOfDay() का उपयोग करना। " – JustinKSU

5

ओह, मैंने नहीं देखा कि यह जोडाटाइम के बारे में था। वैसे भी:

Calendar c = Calendar.getInstance(); 
c.setTime(date); 
c.set(Calendar.HOUR_OF_DAY, 0); 
c.set(Calendar.MINUTE, 0); 
c.set(Calendar.SECOND, 0); 
c.set(Calendar.MILLISECOND, 0); 

int min = c.getActualMinimum(Calendar.DAY_OF_MONTH); 
int max = c.getActualMaximum(Calendar.DAY_OF_MONTH); 
for (int i = min; i <= max; i++) { 
    c.set(Calendar.DAY_OF_MONTH, i); 
    System.out.println(c.getTime()); 
} 

या इसका उपयोग करते कॉमन्स-लैंग:

Date min = DateUtils.truncate(date, Calendar.MONTH); 
Date max = DateUtils.addMonths(min, 1); 
for (Date cur = min; cur.before(max); cur = DateUtils.addDays(cur, 1)) { 
    System.out.println(cur); 
} 

+0

जावा मूल एपीआई नोट के लिए धन्यवाद। मैंने इससे भी सीखा है। कॉमन्स-लैंग उदाहरण के लिए –

+0

+1, यह आसान है – Peter

28

एक वैकल्पिक तरीका (खाते में DateMidnight लेने के बिना) महीने के पहले दिन प्राप्त करने के लिए उपयोग करने के लिए होगा:

DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue(); 
+5

जोडा समय अद्भुत है – tbruyelle

+5

हालांकि तिथि महीने का पहला होगा, समय भी दिन के मध्य में होगा। अंत में .withTimeAtStartOfDay() जोड़ना इसे हल करेगा। – JustinKSU

+0

आप .dayOfMonth() .MaximumValue()। घंटेऑफडे() के साथ। MaxaxValue() के साथ जोड़ सकते हैं और मिनटों के साथ इसे जोड़ सकते हैं ... अधिक सटीक होने के लिए –

7

दिन के पहले पल

answer by ngeek सही है, लेकिन दिन के पहले पल में समय लगाने में विफल रहता है। समय समायोजित करने के लिए, withTimeAtStartOfDay पर कॉल संलग्न करें।

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 

org.joda.time.DateTime startOfThisMonth = new org.joda.time.DateTime().dayOfMonth().withMinimumValue().withTimeAtStartOfDay(); 
org.joda.time.DateTime startofNextMonth = startOfThisMonth.plusMonths(1).dayOfMonth().withMinimumValue().withTimeAtStartOfDay(); 

System.out.println("startOfThisMonth: " + startOfThisMonth); 
System.out.println("startofNextMonth: " + startofNextMonth); 

जब सिएटल अमेरिका में चला ...

startOfThisMonth: 2013-11-01T00:00:00.000-07:00 
startofNextMonth: 2013-12-01T00:00:00.000-08:00 

नोट कंसोल आउटपुट के उन दो पंक्तियों में अंतर: -7 बनाम -8 की वजह से Daylight Saving Time


आम तौर पर डिफ़ॉल्ट रूप से भरोसा करने के बजाय हमेशा समय क्षेत्र निर्दिष्ट करना चाहिए। सादगी के लिए यहां छोड़ा गया। किसी को इस तरह की एक पंक्ति जोड़नी चाहिए, और उपरोक्त उदाहरण में उपयोग किए गए रचनाकारों को समय क्षेत्र वस्तु को पास करना चाहिए।

// Time Zone list: http://joda-time.sourceforge.net/timezones.html (Possibly out-dated, read note on that page) 
// UTC time zone (no offset) has a constant, so no need to construct: org.joda.time.DateTimeZone.UTC 
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID("Asia/Kolkata"); 

java.time

ऊपर सही लेकिन पुरानी हो चुकी है। जोडा-टाइम लाइब्रेरी अब Java 8 और बाद में जावा में निर्मित जावा.टाइम फ्रेमवर्क द्वारा प्रदान की जाती है।

LocalDate समय-समय पर और समय क्षेत्र के बिना दिनांक-केवल मूल्य का प्रतिनिधित्व करता है।एक तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए तिथि दुनिया भर में जोन द्वारा भिन्न होती है।

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(zoneId); 

महीने के पहले प्राप्त करने के लिए TemporalAdjusters में से किसी एक का उपयोग करें।

LocalDate firstOfMonth = today.with(TemporalAdjusters.firstDayOfMonth()); 

LocalDate एक ZonedDateTime कि दिन के पहले पल का प्रतिनिधित्व करता उत्पन्न कर सकते हैं।

ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay(zoneId); 
-1

DateMidnight अब बहिष्कृत है। इसके बजाय आप कर सकते हैं:

LocalDate firstOfMonth = new LocalDate(date).withDayOfMonth(1); 
LocalDate lastOfMonth = firstOfMonth.plusMonths(1).minusDays(1); 

क्या आप जानते हैं समय क्षेत्र का उपयोग new LocalDate(date, timeZone) बजाय अधिक सटीकता के लिए है।

तुम भी .dayOfMonth().withMinimumValue() के बजाय .withDayOfMonth(1)

संपादित कर सकते हैं:

यह आपको 12/1/YYYY 00:00 और 12/31/YYYY 00:00 दे देंगे। यदि आप महीने के आखिरी महीने में वास्तव में अगले महीने के पहले होते हैं (क्योंकि आप क्लॉज के बीच एक कर रहे हैं), तो minusDays(1) को अंतिम ओफमोन्थ गणना

+0

यह अंतिम ओफमोन्थ के लिए गलत है। –

+0

@Xylian मुझे लगता है कि यह प्रश्न की व्याख्या पर निर्भर करता है। किसी भी दिन, यह आपको महीने के पहले दिन और महीने के आखिरी दिन के आधी रात को आधी रात देगा। यदि आप अगले महीने के पहले दिन के मध्यरात्रि चाहते हैं, तो बस ".minusDays (1) को दूसरे से हटा दें। अगर आपको अभी भी लगता है कि मेरा जवाब गलत है, तो कृपया विस्तृत करें, क्योंकि मेरे यूनिट परीक्षणों का कहना है कि यह काम करता है। – JustinKSU

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