如何使用 Java 日历获取特定月份的天数?
How to get the number of days in a specific month using Java Calendar?
我正在创建一个简单的程序,允许用户查看他们设置的月份之间有多少天。
例如从一月到三月
我可以使用这个获取当前日期:
Calendar.DAY_OF_MONTH
我想要的是如何提供月份的值?
我有这个简单的代码:
public static void machineProblemTwo(int startMonth, int endMonth) {
int[] month = new int[0];
int date = 2015;
for(int x = startMonth; x <= endMonth; x++) {
System.out.println(x + " : " + getMaxDaysInMonth(x,date));
}
}
public static int getMaxDaysInMonth(int month, int year){
Calendar cal = Calendar.getInstance();
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // how can I supply the month here?
return days;
}
我该怎么做?你能帮我解决这个问题吗?
你需要设置日历为be那年那月才求最大值,例如与
cal.set(year, month, 1);
(或根据 David 的回答使用日历构造函数。)
所以:
public static int getMaxDaysInMonth(int month, int year) {
Calendar cal = Calendar.getInstance();
// Note: 0-based months
cal.set(year, month, 1);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}
或者 - 最好 - 使用 Joda Time 或 Java 8:
// Java 8: 1-based months
return new LocalDate(year, month, 1).lengthOfMonth();
// Joda Time: 1-based months
return new LocalDate(year, month, 1).dayOfMonth().getMaximumValue();
(我确定一定有更简单的 Joda Time 选项,但我还没有找到它...)
使用 GregorianCalendar
的构造函数来传递年月日。不要忘记月份是从 0 到 11(0 代表一月,11 代表十二月)。
public static int numberOfDaysInMonth(int month, int year) {
Calendar monthStart = new GregorianCalendar(year, month, 1);
return monthStart.getActualMaximum(Calendar.DAY_OF_MONTH);
}
我们也可以这样做:
private DateTime getNewDate(DateTime date, int dayOfMonth) {
// first we need to make it 1st day of the month
DateTime newDateTime = new DateTime(date.getYear(), date.getMonthOfYear(), 1, 0, 0);
int maximumValueOfDays = newDateTime.dayOfMonth().getMaximumValue();
// to handle the month which has less than 31 days
if (dayOfMonth > maximumValueOfDays) {
newDateTime = newDateTime.dayOfMonth().withMaximumValue();
} else {
newDateTime = newDateTime.withDayOfMonth(dayOfMonth);
}
return newDateTime;
}
我正在创建一个简单的程序,允许用户查看他们设置的月份之间有多少天。
例如从一月到三月
我可以使用这个获取当前日期:
Calendar.DAY_OF_MONTH
我想要的是如何提供月份的值?
我有这个简单的代码:
public static void machineProblemTwo(int startMonth, int endMonth) {
int[] month = new int[0];
int date = 2015;
for(int x = startMonth; x <= endMonth; x++) {
System.out.println(x + " : " + getMaxDaysInMonth(x,date));
}
}
public static int getMaxDaysInMonth(int month, int year){
Calendar cal = Calendar.getInstance();
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // how can I supply the month here?
return days;
}
我该怎么做?你能帮我解决这个问题吗?
你需要设置日历为be那年那月才求最大值,例如与
cal.set(year, month, 1);
(或根据 David 的回答使用日历构造函数。)
所以:
public static int getMaxDaysInMonth(int month, int year) {
Calendar cal = Calendar.getInstance();
// Note: 0-based months
cal.set(year, month, 1);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}
或者 - 最好 - 使用 Joda Time 或 Java 8:
// Java 8: 1-based months
return new LocalDate(year, month, 1).lengthOfMonth();
// Joda Time: 1-based months
return new LocalDate(year, month, 1).dayOfMonth().getMaximumValue();
(我确定一定有更简单的 Joda Time 选项,但我还没有找到它...)
使用 GregorianCalendar
的构造函数来传递年月日。不要忘记月份是从 0 到 11(0 代表一月,11 代表十二月)。
public static int numberOfDaysInMonth(int month, int year) {
Calendar monthStart = new GregorianCalendar(year, month, 1);
return monthStart.getActualMaximum(Calendar.DAY_OF_MONTH);
}
我们也可以这样做:
private DateTime getNewDate(DateTime date, int dayOfMonth) {
// first we need to make it 1st day of the month
DateTime newDateTime = new DateTime(date.getYear(), date.getMonthOfYear(), 1, 0, 0);
int maximumValueOfDays = newDateTime.dayOfMonth().getMaximumValue();
// to handle the month which has less than 31 days
if (dayOfMonth > maximumValueOfDays) {
newDateTime = newDateTime.dayOfMonth().withMaximumValue();
} else {
newDateTime = newDateTime.withDayOfMonth(dayOfMonth);
}
return newDateTime;
}