महीने के पहले और अंतिम दिन, थ्रोटेन, लोकलडेट का उपयोग करके प्राप्त करें


127

मेरे पास एक लोकलडेट है जिसे महीने का पहला और आखिरी दिन मिलना चाहिए। मैं उसको कैसे करू?

जैसे। 13/2/2014 मैं प्राप्त करने की आवश्यकता 1/2/2014है और 28/2/2014में LOCALDATE प्रारूपों।

थ्रोटन लोकलडेट क्लास का उपयोग करना।

जवाबों:


180

बस का उपयोग करें withDayOfMonth, और lengthOfMonth():

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());

3
FYI करें अन्य उत्तर देखें
assylias

147

एपीआई को एक समाधान का समर्थन करने के लिए डिज़ाइन किया गया था जो व्यावसायिक आवश्यकताओं के साथ मेल खाता है

import static java.time.temporal.TemporalAdjusters.*;

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());

हालांकि, जॉन के समाधान भी ठीक हैं।


5
इस एक के साथ जा रहे हैं, विशेष रूप से इस विशेष समस्या को संभालने के लिए बनाए गए एपीआई संसाधनों का उपयोग करता है।
jpangamarca

87

YearMonth

मेरी राय में पूर्णता, और अधिक सुरुचिपूर्ण के लिए, YearMonthवर्ग का यह उपयोग देखें ।

YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end   = month.atEndOfMonth();

चालू माह के पहले और अंतिम दिन के लिए, यह बन जाता है:

LocalDate start = YearMonth.now().atDay(1);
LocalDate end   = YearMonth.now().atEndOfMonth();

8
सभी का सबसे अच्छा समाधान।
अगस्टी सैंचेज़

अतिरिक्त जानकारी: YearMonth वर्षमार्ट = YearMonth.parse ("202004", DateTimeFormatter.ofPattern ("yyyyMM"));
एगमिन

LocalDate withविधि की तुलना में इसके क्या फायदे हैं ?
एंड्रयूब्लूम

@AndrewBloom आपको महीने के अंतिम दिन प्राप्त करने के लिए एक स्थिर फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है, और कम से कम दूसरे उदाहरण में, आपको LocalDateशुरू करने के लिए एक उदाहरण की आवश्यकता नहीं है ।
हरमन

18

जॉन स्कीट्स का उत्तर सही है और मेरे उत्थान के योग्य है, बस इसे पूर्णता के लिए थोड़ा अलग समाधान जोड़ना है:

import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());

2
प्रिय downvoter, ईमानदारी से, मैं downvote नहीं समझता क्योंकि मेरा जवाब JodaStephen के एक दिन पहले भी था और मुख्य रूप से दिलचस्प नए हिस्से की ओर इशारा किया, अर्थात् महीने के अंत के लिए लौकिक समायोजक। यही कारण है कि मैंने किसी और से जवाब की "नकल" नहीं की है।
मेनो होच्स्चिल्ड

बहुत बढ़िया जवाब! क्योंकि यह अनुशंसा की जाती है यह समाधान बेहतर है डॉक्स "... महीने के पहले या आखिरी दिन खोजने":
peterchaula

4

अगर कोई की तलाश में आता है पिछले महीने के पहले दिन और पिछले महीने के अंतिम दिन :

public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
        return date.minusMonths(1).withDayOfMonth(1);
    }


public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
        return date.withDayOfMonth(1).minusDays(1);
    }

अच्छा कोड, लेकिन स्टैक ओवरफ्लो में एक प्रश्न की बारीकियों को संबोधित करना चाहिए।
बासिल बॉर्क

धन्यवाद, मैं सहमत हूं। कभी-कभी हम धागे में संबंधित कोड पाते हैं, जैसा कि मैं इस के लिए भी देख रहा था। मैंने इसे ऐसे उपयोगकर्ताओं के लिए रखा है। आशा है कि ठीक है। धन्यवाद।
अनिल भास्कर

3
 LocalDate monthstart = LocalDate.of(year,month,1);
 LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);

कृपया अपने उत्तर का वर्णन करें
smilyface

1

आप कस्टम तिथि को इंगित करने से बचने के लिए यह कोशिश कर सकते हैं और यदि वर्तमान माह की आरंभ और समाप्ति तिथियों को प्रदर्शित करने की आवश्यकता है:

    LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
    LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
    System.out.println("Start of month: " + start);
    System.out.println("End of month: " + end);

परिणाम:

>     Start of month: 2019-12-01
>     End of month: 2019-12-30

1
यह मेरे लिए थोड़ा अधूरा लगता है। यह भी सही परिणाम नहीं देता है। इस महीने का अंतिम दिन 2019-12-31 है, लेकिन आपका स्निपेट 2019-12-30 मुद्रित है।
ओले वीवी

0

इसे इस्तेमाल करे:

LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);         
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);

आप इच्छा उत्पादन पा सकते हैं, लेकिन getLastDayOfMonth पद्धति के लिए पैरामीटर सही / गलत का ध्यान रखने की आवश्यकता है

वह पैरामीटर लीप वर्ष को दर्शाता है


उपयोग करने की कोई आवश्यकता नहीं है getLastDayOfMonth- एक सरल दृष्टिकोण के लिए मेरा जवाब देखें।
जॉन स्कीट

0

यदि आप इसे केवल LocalDate- श्रेणी के साथ करना चाहते हैं:

LocalDate initial = LocalDate.of(2014, 2, 13);

LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);

// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);

0

बस यहाँ @herman समाधान के लिए मेरे कार्यान्वयन को दिखाने के लिए

ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");

static Date firstDateOfMonth(Date date) {
  LocalDate localDate = convertToLocalDateWithTimezone(date);
  YearMonth baseMonth = YearMonth.from(localDate);
  LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
  return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}

static Date lastDateOfMonth(Date date) {
  LocalDate localDate = convertToLocalDateWithTimezone(date);
  YearMonth baseMonth = YearMonth.from(localDate);
  LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
  return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}

static LocalDate convertToLocalDateWithTimezone(Date date) {
  return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}

LocalDateTimeयहाँ उपयोग करने के लिए गलत वर्ग है। आप मूल्यवान ज़ोन / ऑफ़सेट जानकारी त्याग रहे हैं।
il:४

प्रश्न दिनांक-केवल मान के लिए पूछता है, न कि उस दिनांक-समय मान के साथ जो आप यहाँ चाहते हैं। और भयानक विरासत वर्ग Dateका प्रश्न से कोई लेना-देना नहीं है, और आमतौर पर इससे बचना चाहिए।
बेसिल बोर्क्स

1
ला पाज़ समय क्षेत्र के लिए कृपया अधिक सही का उपयोग करें ZoneId.of("America/La_Paz")। वर्तमान तारीखों के लिए यह एक ही परिणाम देगा, लेकिन शायद भविष्य में ऐतिहासिक तारीखों या तारीखों के लिए नहीं।
ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.