使用Java中的日历类获取月份的开始日期和月份的结束日期

bra*_*orm 1 java calendar date

给定一年零一个月; 我想要两个Date Objects.一个startDate月份,一个end Date月份.我在这里实现了它,它的工作原理.但这看起来太冗长了,我想知道是否有一个简洁的解决方案;

例如,2014年3月,开始日期为3月1日,结束日期为3月31日(Date objects精确到毫秒)

public setDates(int month,int year) {

        Calendar calendar = Calendar.getInstance();


        // Use the calendar to get the startDate and endDate of this Invoice.
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH,month);

        //set start date
        calendar.set(Calendar.DAY_OF_MONTH,
                     calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY,
                     calendar.getActualMinimum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE,
                     calendar.getActualMinimum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND,
                     calendar.getActualMinimum(Calendar.SECOND));
        calendar.set(Calendar.MILLISECOND,
                     calendar.getActualMinimum(Calendar.MILLISECOND));
        this.startDate = calendar.getTime();

        //endDate start date
        calendar.set(Calendar.DAY_OF_MONTH,
                     calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY,
                     calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.MINUTE,
                     calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND,
                     calendar.getActualMaximum(Calendar.SECOND));
        calendar.set(Calendar.MILLISECOND,
                     calendar.getActualMaximum(Calendar.MILLISECOND));
        this.endDate = calendar.getTime();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

通过做出一些假设,您可以使此代码更加简单:

  • 这个月的第一天总是第1天
  • 最小小时始终为0
  • ......等

然后,您可以通过添加一个月并减去一毫秒来找到该月的最后一毫秒.

所以代码看起来像这样:

// Note year/month reversal: try to consistently use larger units first. It
// makes for a cleaner API.
public setDates(int year, int month, TimeZone zone) {
    Calendar calendar = Calendar.getInstance(zone);

    // Do you really want 0-based months, like Java has? Consider month - 1.
    calendar.set(year, month, 1, 0, 0, 0);
    calendar.clear(Calendar.MILLISECOND);
    startDate = calendar.getTime();

    // Get to the last millisecond in the month
    calendar.add(Calendar.MONTH, 1);
    calendar.add(Calendar.MILLISECOND, -1);
    endDate = calendar.getTime();
}
Run Code Online (Sandbox Code Playgroud)

要使用独占上限(正如我所推荐的那样),只需摆脱calendar.add(Calendar.MILLISECOND, -1)接近尾声.

哦,我完全建议使用Joda Time而不是java.util.Date等 - 这是一个清洁的API.