2010-09-22 8 views
47
30 days hath September, 
    April, June and November, 
All the rest have 31, 
    Excepting February alone 
(And that has 28 days clear, 
    With 29 in each leap year). 

क्या मैं यह जानकारी anagrammatically प्राप्त कर सकता हूं? (मैं कविता मतलब नहीं है, निश्चित रूप से)मैं जोडा-टाइम का उपयोग करके किसी दिए गए महीने के भीतर दिनों की संख्या कैसे प्राप्त करूं?

+0

हममम ... anagramatically, या प्रोग्रामेटिक रूप से? – Lambart

उत्तर

85

आप एक DateTime वस्तु किस महीने में एक मूल्य का प्रतिनिधित्व करता है, तो यह बहुत सीधा है। आपको ऑब्जेक्ट से dayOfMonth संपत्ति मिलती है और संपत्ति का अधिकतम मूल्य प्राप्त होता है।

public static int daysOfMonth(int year, int month) { 
    DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000); 
    return dateTime.dayOfMonth().getMaximumValue(); 
} 
+0

यह मेरे लिए काम नहीं किया। getMaximumValue() नवंबर के लिए 31 लौटाता है, जो बिल्कुल सही नहीं है। –

+7

@ChrisGerken: हो सकता है कि आपके महीने शून्य-अनुक्रमित हों? जोडा के लिए, माह 1-12 से एक मूल्य होना चाहिए। यदि आपने नवंबर के लिए 10 का उपयोग किया था, तो जोडाए अक्टूबर के रूप में देखेगा और 31 लौटाएगा। –

+0

लगभग सभी मेरी संबंधित संबंधित बग हैं क्योंकि जोडा शून्य अनुक्रमित नहीं है। याद रखना मुश्किल है! –

0
Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.MONTH, yourMonth); 
cal.set(Calendar.YEAR, yourYear); 
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result! 
+2

यह जोडाटाइम नहीं है। ओपी ने स्पष्ट रूप से इसके लिए पूछा। – BalusC

+0

ओप्स। सटीक ... मैंने समस्या पर ध्यान केंद्रित किया और शीर्षक भूल गया ... लेकिन यदि परिणाम मानक एपीआई के साथ आसानी से प्राप्त किया जा सकता है, तो जोडाटाइम जैसे बाहरी एपीआई बेकार है। –

+5

मैं व्यक्तिगत रूप से java.util.Calendar से * अच्छी तरह से * दूर रहूंगा। जोडा टाइम एक बहुत दूर, बहुत बेहतर एपीआई है। उदाहरण के लिए, आप कितने आत्मविश्वास के बारे में हैं कि अगर आप इसे फरवरी में सेट करते हैं तो 'GetInstance' 31 सितंबर को वापस आता है? ओह, और यह मत भूलना कि फरवरी महीने 1 है ... –

3

हां, हालांकि यह रूप में सुंदर नहीं है के रूप में यह हो सकता है:: यहाँ एक नमूना समारोह है

import org.joda.time.*; 
import org.joda.time.chrono.*; 
import org.joda.time.field.*; 

public class Test { 
    public static void main(String[] args) { 
     GregorianChronology calendar = GregorianChronology.getInstance(); 
     DateTimeField field = calendar.dayOfMonth(); 

     for (int i = 1; i < 12; i++) { 
      LocalDate date = new LocalDate(2010, i, 1, calendar); 
      System.out.println(field.getMaximumValue(date)); 
     } 
    } 
} 

ध्यान दें कि मैं इस धारणा हार्ड-कोडेड 12 महीने देखते हैं कि, और कहा कि है हम 2010 में रुचि रखते हैं। मेरे पास स्पष्ट रूप से ग्रेगोरियन कालक्रम का चयन किया गया है - हालांकि अन्य क्रोनोलॉजीज में आपको अलग-अलग उत्तर मिलेंगे। (और "12 महीने" लूप एक मान्य धारणा नहीं होगी ...)

मैं मूल्य लाने के लिए DateTime के बजाय LocalDate के लिए गया हूं, जोर देने के लिए (हालांकि बेहोशी :) मान समय क्षेत्र पर निर्भर नहीं है।

यह अभी भी उतना आसान नहीं है जितना दिखता है, आपको याद है। मुझे पता नहीं है कि क्या होता है यदि LocalDate बनाने के लिए एक कालक्रम का उपयोग करें, लेकिन एक अलग कालक्रम में एक क्षेत्र के अधिकतम मूल्य के लिए पूछें। मैं हो सकता है कि क्या होने, Joda समय के बारे में एक निश्चित राशि जानने के बारे में कुछ विचार है, लेकिन यह शायद एक अच्छा विचार है :)

-1

यहाँ एक और सरल कार्य है नहीं है:

int daysOfMonth(DateTime dt) { 
    int month = dt.getMonthOfYear(); 
    int month2 = month; 
    int days = dt.getDay(); 
    DateTime dt2 = dt; 
    while (month == month2) { 
     days++; 
     dt2.addDays(1); 
     month2 = dt2.getMonthOfYear(); 
    } 
    return (days - 1); 
} 
संबंधित मुद्दे