Java 特定年份特定月份的天数?

Java 特定年份特定月份的天数?,java,datetime,calendar,Java,Datetime,Calendar,如何知道特定年份的特定月份有多少天 String date = "2010-01-19"; String[] ymd = date.split("-"); int year = Integer.parseInt(ymd[0]); int month = Integer.parseInt(ymd[1]); int day = Integer.parseInt(ymd[2]); Calendar calendar = Calendar.getInstance(); calendar.set(Cale

如何知道特定年份的特定月份有多少天

String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this
Java8及更高版本 @沃伦·M·诺科斯。 如果您试图使用Java8的新版本,那么可以使用类。看

测试:在闰年中尝试一个月:

yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29 
Java7及更早版本 创建日历,设置年和月,并使用
getactualmax

int iYear = 1999;
int iMonth = Calendar.FEBRUARY; // 1 (months begin with 0)
int iDay = 1;

// Create a calendar object and set year and month
Calendar mycal = new GregorianCalendar(iYear, iMonth, iDay);

// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 28
测试:在闰年中尝试一个月:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
java.util.Calendar的代码 如果必须使用
java.util.Calendar
,我怀疑您需要:

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
乔达时间代码 然而,就个人而言,我建议首先使用而不是
java.util.{Calendar,Date}
,在这种情况下,您可以使用:

int days = chronology.dayOfMonth().getMaximumValue(date);

请注意,与其单独解析字符串值,不如获取用于解析字符串的日期/时间API。在
java.util.*
中,可以使用
SimpleDataFormat
;在Joda Time中,您可以使用
DateTimeFormatter

您可以使用
日历。getActualMaximum
方法:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);
java.time.LocalDate
在Java 1.8中,您可以在以下对象上使用该方法:


以下方法将为您提供特定月份的天数

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}

您可以使用Calendar.getActualMaximum方法:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
int numDays = calendar.getActualMaximum(Calendar.DATE);
而month-1是因为month取其原始月数,而in方法中的参数在Calendar.class中如下所示

public int getActualMaximum(int field) {
   throw new RuntimeException("Stub!");
}
(int字段)如下所示

public static final int JANUARY = 0;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;

这对我很管用


在Java8中,可以从日期字段中使用GetValueRange

LocalDateTime dateTime = LocalDateTime.now();

ChronoField chronoField = ChronoField.MONTH_OF_YEAR;
long max = dateTime.range(chronoField).getMaximum();

这允许您在字段上进行参数化。

这是数学方法:

年、月(1至12):


应避免使用过时的
日历
API

在Java8或更高版本中,这可以通过以下方式完成

示例代码:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);

这么简单,不需要导入任何东西

public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}

如果您不想硬编码年和月的值,并且希望从当前日期和时间获取该值,那么让我们将其简化为:

Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );

我会选择这样的解决方案:

int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
    int year = getYear();
    final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
    daysInMonth = monthEnum.length(leapYear);
} else {
    daysInMonth = monthEnum.maxLength();
}
如果月份不是2月(92%的情况),则只取决于月份,不涉及年份更有效。这样,你就不必调用逻辑来判断这是否是闰年,你也不需要在92%的情况下得到年份。
它仍然是清晰易读的代码。

一个最佳的性能变化:

public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}

有关leap算法的更多详细信息,请查看特定年份的天数-Java 8+解决方案

Year.now().length()


您的问题到底是什么?仅供参考,像和
java.text.simpleDataFormat
这样非常麻烦的旧日期时间类现在被java 8和更高版本中内置的类所取代。请参见.Calendar c=Calendar.getInstance();c、 设置(Calendar.DAY\u OF_MONTH,c.getActualMaximum(Calendar.DAY\u OF_MONTH));//您可以在获得实际最大值之前设置年份,因为它们可能不相同。ie 2011年2月和2012年2月的长度不同(闰年)。与现有的和公认的答案相比,这个答案有什么价值?另外,请在代码中添加一些解释或叙述。StackOverflow不仅仅是一个代码片段库。不需要回答一个已经被接受的问题,直到这个答案无效为止。如何在Java 8的新日期和时间API上做到这一点?@WarrenM.Nocos很抱歉响应太晚,但我这几个月没有活动。请检查针对java 8的解决方案的编辑。至于java 8之前的版本…在项目中,java.time的大部分功能都被向后移植到java 6和java 7。进一步适应项目中早期的Android。请参阅。还要添加一些说明。欢迎使用堆栈溢出!虽然这个代码片段可能是解决方案,但它确实有助于提高文章的质量。请记住,您将为将来的读者回答这个问题,这些人可能不知道您的代码建议的原因。
调用需要API级别26(当前最小值为21):java.time.YearMonth#lengthOfMonth
值得注意的是,它是针对Android的(
Android.util.MonthDisplayHelper
)我更愿意将整个逻辑留给一个经过验证的库方法——我认为您正在过早地进行优化,而且库方法并没有那么低效。仍然支持使用现代java.time@OleV.V。诚然,在许多情况下,将优化留给经验证的库会更好。但是,在这种情况下,现有的图书馆将需要通过一个月和一年。因此,这意味着我需要不惜一切代价获得年份,即使该方法不会在92%的情况下使用该值。所以,这是我无法优化的部分。我的推理类似于为什么不应该执行方法调用来获取要传递给可能被禁用的记录器的值。日志记录器无法优化它。如果您不需要历史日期或将来的日期,这是可以的。对于100倍而不是400倍的2月份来说,这是错误的。但我同意,在大多数应用程序中,这样做是有效的,但不能解决这个问题。问题在于月长,而不是年长。而
.length()
方法已经在其他答案中多次涉及。字符串日期的格式应该是什么?
int daysInMonth = month !== 2 ? 
  31 - (((month - 1) % 7) % 2) : 
  28 + (year % 4 == 0 ? 1 : 0) - (year % 100 == 0 ? 1 : 0) + (year % 400 == 0 ? 1 : 0)
public class Main {

    private static LocalDate local=LocalDate.now();
    public static void main(String[] args) {

            int month=local.lengthOfMonth();
            System.out.println(month);

    }
}
int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);
public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}
String  MonthOfName = "";
int number_Of_DaysInMonth = 0;

//year,month
numberOfMonth(2018,11); // calling this method to assign values to the variables MonthOfName and number_Of_DaysInMonth 

System.out.print("Number Of Days: "+number_Of_DaysInMonth+"   name of the month: "+  MonthOfName );

public void numberOfMonth(int year, int month) {
    switch (month) {
        case 1:
            MonthOfName = "January";
            number_Of_DaysInMonth = 31;
            break;
        case 2:
            MonthOfName = "February";
            if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
                number_Of_DaysInMonth = 29;
            } else {
                number_Of_DaysInMonth = 28;
            }
            break;
        case 3:
            MonthOfName = "March";
            number_Of_DaysInMonth = 31;
            break;
        case 4:
            MonthOfName = "April";
            number_Of_DaysInMonth = 30;
            break;
        case 5:
            MonthOfName = "May";
            number_Of_DaysInMonth = 31;
            break;
        case 6:
            MonthOfName = "June";
            number_Of_DaysInMonth = 30;
            break;
        case 7:
            MonthOfName = "July";
            number_Of_DaysInMonth = 31;
            break;
        case 8:
            MonthOfName = "August";
            number_Of_DaysInMonth = 31;
            break;
        case 9:
            MonthOfName = "September";
            number_Of_DaysInMonth = 30;
            break;
        case 10:
            MonthOfName = "October";
            number_Of_DaysInMonth = 31;
            break;
        case 11:
            MonthOfName = "November";
            number_Of_DaysInMonth = 30;
            break;
        case 12:
            MonthOfName = "December";
            number_Of_DaysInMonth = 31;
    }
}
Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );
// 1 means Sunday ,2 means Monday .... 7 means Saturday
//month starts with 0 (January)

MonthDisplayHelper monthDisplayHelper = new MonthDisplayHelper(2019,4);
int numbeOfDaysInMonth = monthDisplayHelper.getNumberOfDaysInMonth();
int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
    int year = getYear();
    final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
    daysInMonth = monthEnum.length(leapYear);
} else {
    daysInMonth = monthEnum.maxLength();
}
public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}
Year.now().length()