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

时间:2014-02-04 20:48:32

标签: java date calendar

给出一年零一个月;我想得到两个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();
}

3 个答案:

答案 0 :(得分:5)

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

  • 本月的第一天总是第1天
  • 最小时数始终为0
  • ...... etc

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

所以代码看起来像这样:

// 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();
}

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

哦,我完全建议使用Joda Time代替java.util.Date等 - 这是很多更干净的API。

答案 1 :(得分:0)

3月1日。在月份字段中添加1。然后减去1天 这是你这个月的最后一天。

第一天很清楚,这是一年中的第一天。

详细是可以的,没有那么冗长的代码版本 (在JDK< = 7中),如果你坚持使用Java的内置库。

答案 2 :(得分:0)

请使用JODA。

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Period;


public class Dates {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //without JODA

        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Helsinki"));

        calendar.set(1921, 4, 1, 0, 0, 0);
        calendar.clear(Calendar.MILLISECOND);
        Date startDate = calendar.getTime();

        System.out.println(startDate);

        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.MILLISECOND, -1);
        Date endDate = calendar.getTime();

        System.out.println(endDate);

        /*
         * Sat Apr 30 19:20:08 BRT 1921
         * Tue May 31 19:20:07 BRT 1921
         */

        //with JODA
        DateTimeZone zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Europe/Helsinki"));
        DateTime dt = new DateTime(1921, 4, 1, 0, 0, 0, 0, zone);
        DateTime plusPeriod = dt.plus(Period.months(1)).minus(Period.millis(1));

        System.out.println(dt);
        System.out.println(plusPeriod);

        /*
         * 1921-04-01T00:00:00.000+01:39:52
         * 1921-04-30T23:59:59.999+01:39:52
         */
    }
}