java获取给定月份和给定年份的第一个日期和最后日期

时间:2013-01-23 08:42:25

标签: java date calendar

我正在尝试获取给定月份和年份的第一个日期和最后日期。我使用以下代码以yyyyMMdd格式获取最后一个日期。但是无法获得这种格式。然后我想以相同的格式开始日期。我还在努力。任何人都可以帮我修复下面的代码。

public static java.util.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);
    java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
    return monthEndDate;
}

public static void main(String[] args) {
    int month = 3;
    int year = 2076;
    final java.util.Date calculatedDate = calculateMonthEndDate(month, year);
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    format.format(calculatedDate);
    System.out.println("Calculated month end date : " + calculatedDate);
} 

9 个答案:

答案 0 :(得分:12)

java.time.YearMonth

Java 8中的新java.time frameworkTutorial)具有此命令。

恰当命名的YearMonth课程代表一年中的一个月,没有任何特定的日期或时间。从那里我们可以要求第一天和第几天。

YearMonth yearMonth = YearMonth.of( 2015, 1 );  // January of 2015.
LocalDate firstOfMonth = yearMonth.atDay( 1 );
LocalDate last = yearMonth.atEndOfMonth();

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:5)

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.format(calculatedDate);
System.out.println("Calculated month end date : " + calculatedDate);

将其更改为

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String formattedDate =  format.format(calculatedDate);
System.out.println("Calculated month end date : " + formattedDate);

了解更多详情

http://docs.oracle.com/javase/1.5.0/docs/api/java/text/DateFormat.html#format(java.util.Date

另一种方法

package com.shashi.mpoole;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateMagic {

    public static String PATTERN = "yyyyMMdd";


    static class Measure
    {
        private int month;
        private int year;
        private Calendar calendar;

        public Measure() {
            // TODO Auto-generated constructor stub
            init();

        }

        private void init() {
            // TODO Auto-generated method stub
             calendar = Calendar.getInstance();
             calendar.set(year, month, 1);

        }

        public String min()
        {
            return format(calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        }

        public String max()
        {
            return format(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        }

        private Date date(GregorianCalendar c)
        {
            return new java.util.Date(c.getTime().getTime());

        }

        private GregorianCalendar gc(int day)
        {
            return new GregorianCalendar(year, month, day);
        }


        private String format(int day) {

             SimpleDateFormat format = new SimpleDateFormat(PATTERN);
             return format.format(date(gc(day)));
        }

        public Measure month(int month) {
            // TODO Auto-generated method stub
            this.month = month -1 ;
            return this;
        }

        public Measure year(int year) {
            // TODO Auto-generated method stub
            this.year = year;
            return this;
        }
    }



    public static void main(String[] args) {

        Measure measure = new Measure().month(3).year(2076);
        System.out.println(measure.max());
        System.out.println(measure.min());
    } 


}

答案 2 :(得分:5)

获取开始日期

    GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
    java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
    System.out.println(monthEndDate);

注意 :在开始日期 = 1)

格式化

SimpleDateFormat format = new SimpleDateFormat(/////////add your format here);
System.out.println("Calculated month end date : " + format.format(calculatedDate));

答案 3 :(得分:5)

只需使用Calendar类即可。你应该为月份变量分配你想要的月份

        Calendar gc = new GregorianCalendar();
        gc.set(Calendar.MONTH, month);
        gc.set(Calendar.DAY_OF_MONTH, 1);
        Date monthStart = gc.getTime();
        gc.add(Calendar.MONTH, 1);
        gc.add(Calendar.DAY_OF_MONTH, -1);
        Date monthEnd = gc.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

        System.out.println("Calculated month start date : " + format.format(monthStart));
        System.out.println("Calculated month end date : " + format.format(monthEnd));

答案 4 :(得分:4)

在下个月的最后一天尝试以下代码: -

Calendar c = Calendar.getInstance();      
c.set(2012,3,1); //------>  
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
System.out.println(sdf.format(c.getTime())); 

http://www.coderanch.com/t/385759/java/java/date-date-month

答案 5 :(得分:4)

第一天:

Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);

每月的最后一天:

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

答案 6 :(得分:2)

        GregorianCalendar gc = new GregorianCalendar(year, selectedMonth-1, 1);
           java.util.Date monthStartDate = new java.util.Date(gc.getTime().getTime());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(monthStartDate);
        calendar.add(calendar.MONTH, 1);
        calendar.add(calendar.DAY_OF_MONTH, -1);
           java.util.Date monthEndDate = new java.util.Date(calendar.getTime())

答案 7 :(得分:1)

虽然不完全是OP问题的答案,但下面的方法将给出当前月份优先&最后日期为Java 8+ LocalDate实例。

public static LocalDate getCurrentMonthFirstDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);
}

public static LocalDate getCurrentMonthLastDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);
}

旁注:使用LocalDate.ofEpochDay(...)代替LocalDate.now()会大大提高性能。此外,使用millis-in-day-expression而不是结束值86400000表现更好。我最初认为后者的表现要好于表达式:P

为什么这个答案这仍然不是OP问题的正确答案,但我仍然在这里回答,因为Google在搜索' java 8时显示了这个问题月份开始日期' :)

答案 8 :(得分:0)

public static Date[] getMonthInterval(Date data) throws Exception {

    Date[] dates = new Date[2];

    Calendar start = Calendar.getInstance();
    Calendar end = Calendar.getInstance();

    start.setTime(data);
    start.set(Calendar.DAY_OF_MONTH, start.getActualMinimum(Calendar.DAY_OF_MONTH));
    start.set(Calendar.HOUR_OF_DAY, 0);
    start.set(Calendar.MINUTE, 0);
    start.set(Calendar.SECOND, 0);

    end.setTime(data);
    end.set(Calendar.DAY_OF_MONTH, end.getActualMaximum(Calendar.DAY_OF_MONTH));
    end.set(Calendar.HOUR_OF_DAY, 23);
    end.set(Calendar.MINUTE, 59);
    end.set(Calendar.SECOND, 59);

    //System.out.println("start "+ start.getTime());
    //System.out.println("end   "+ end.getTime());

    dates[0] = start.getTime();
    dates[1] = end.getTime();

    return dates;
}