获取月份的最后一天

25

我编写了这个函数来获取本月的最后一天。

/**
 * @param month integer value of month
 * @param year integer value of month
 * @return last day of month in MM/dd/YYYY format
 */
private static String getDate(int month, int year) {
    Calendar calendar = Calendar.getInstance();
    // passing month-1 because 0-->jan, 1-->feb... 11-->dec
    calendar.set(year, month - 1, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
    Date date = calendar.getTime();
    DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/YYYY");
    return DATE_FORMAT.format(date);
}

所有输入都正常工作,唯一的例外是当月份为12月时,即getDate(12,2012)返回12/31/2013,但应返回12/31/2012。 请解释此行为并提供解决方案。


请点击这里查看相关的编程内容:https://dev59.com/8WYr5IYBdhLWcg3wg6X9 。这可能对你有所帮助。 - PSR
5
建议修改函数名称为更加描述性的名称,比如getLastDayOfMonth - Carlos Campderrós
可能是获取给定字符串日期的月份最后一天的重复问题。 - satnam
9个回答

8

YYYY 改为 yyyy

DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");  

YYYY 是错误的 dateformat


7

简而言之

YearMonth.of( 2016 , 6 )
         .atEndOfMonth()
         .toString()

2016年06月30日

java.time

使用内置于Java 8及更高版本中的java.time类非常容易。 已经向Java 6和7进行了后移植,并且进一步适用于Android

YearMonth

使用方便的YearMonth类。

提示:传递此类对象以在代码库中获得类型安全、保证有效值和更具自我说明性的代码。

YearMonth yearMonth = YearMonth.of( 2016 , 6 );

…或者…

YearMonth yearMonth = YearMonth.of( 2016 , Month.JUNE );

LocalDate

然后询问该月的最后一天,由LocalDate表示。

LocalDate endOfMonth = yearMonth.atEndOfMonth();

2016年6月30日

字符串

您在上方看到的toString的结果,使用标准ISO 8601格式生成了一个字符串。您可以使用其他格式。

DateTimeFormatter类可以自动转换为人类语言,并将文化规范应用于问题,例如逗号或句号之间的周期或年份-月份-日期部分的排序。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT );
formatter = formatter.withLocale( Locale.US );  // Re-assign JVM’s current default Locale that was implicitly applied to the formatter.
String output = localDate.format( formatter ); 

Locale.US提供了月/日/年的格式。您还可以通过调用DateTimeFormatter.ofPattern来指定显式模式。


1
考虑到新的Java 8,这应该被标记为正确答案。 - divinedragon

5

试试这个

calendar.add(Calendar.MONTH, month);  
calendar.set(Calendar.DAY_OF_MONTH, 1);  
calendar.add(Calendar.DATE, -1);  

Date date = calendar.getTime();

4

试用Joda-Time,它更加简单:

private static String getLastDayOfMonth(int month, int year) {
    LocalDate lastDayOfMonth = new LocalDate(year, month, 1).dayOfMonth().withMaximumValue();
    return lastDayOfMonth.toString("MM/dd/yyyy");
}


3
private static String getDate(int month, int year) {
    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));

    Date date = calendar.getTime();
    DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
    return DATE_FORMAT.format(date);
}

1
With Java 8 DateTime / LocalDateTime :

private static String getDate(int month, int year) {        
    Month monthObj = Month.of(month);       
    LocalDate date = LocalDate.of(year, month, monthObj.maxLength());
    return date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US));
}

YearMonth类更适合这个问题,而且更简单。请参见我的回答 - Basil Bourque

1
您可以使用以下代码获取本月的最后一天
public static String getLastDayOfTheMonth(String date) {
        String lastDayOfTheMonth = "";

        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        try{
        java.util.Date dt= formatter.parse(date);
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(dt);  

        calendar.add(Calendar.MONTH, 1);  
        calendar.set(Calendar.DAY_OF_MONTH, 1);  
        calendar.add(Calendar.DATE, -1);  

        java.util.Date lastDay = calendar.getTime();  

        lastDayOfTheMonth = formatter.format(lastDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return lastDayOfTheMonth;
    }

0

你是否也考虑了闰年?如果没有,你可以尝试下面的代码:

public static Date calculateMonthEndDate(int month, int year) {
    int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int day = daysInAMonth[month];
    boolean isLeapYear = new GregorianCalendar().isLeapYear(year);

    if (isLeapYear && month == 2) {
        day++;
    }
    GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
    Date monthEndDate = new Date(gc.getTime().getTime());
    return monthEndDate;
}

这段代码使用了一些麻烦的旧遗留类,这些类在多年前就被 java.time 类所取代。 - Basil Bourque

0

试试这个

private static String getDate(int month, int year)
{
    Calendar dateCal = Calendar.getInstance();
    dateCal.set(year, month, 2);
    int maxDay = dateCal.getActualMaximum(Calendar.DAY_OF_MONTH);

    String pattern = "MMMM";
    SimpleDateFormat obDateFormat = new SimpleDateFormat(pattern);
    String monthName = obDateFormat.format(dateCal.getTime());

    return "Last date of " + monthName + " " + year + " : " + maxDay;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接