java получает первую дату и последнюю дату данного месяца и данного года [дубликат]

этот вопрос уже есть ответ здесь:

Я пытаюсь получить первую и последнюю дату соответствующего месяца и года. Я использовал следующий код, чтобы получить последнюю дату в формате ггггммдд. Но не смог получить этот формат. Кроме того, я хочу, чтобы дата начала была в том же формате. Я все еще работаю над этим. Может ли кто-нибудь помочь мне в исправлении кода ниже.

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 ответов


для получения Дата Начала

    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));

java.time.YearMonth

новая java.временные рамки в Java 8 (учебник) есть команды для этого.

название YearMonth класс представляет собой месяц года, без какого-либо определенного дня или времени. Оттуда мы можем спросить о первом и днях месяца.

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

о java.время

на java.время база встроенные в Java 8 и выше. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

на Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, см. В Oracle Учебник. Поиск Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.


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


}

попробуйте ниже код для последнего дня месяца : -

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


просто вы можете использовать класс 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));

первый день:

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

последний день месяца:

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

        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())

хотя, не совсем ответ на вопрос 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-a-day вместо конечного значения, которое является 86400000 выполняет лучше. Я изначально думал, что последний будет работать лучше, чем выражение : P

почему этот ответ: все еще это не правильный ответ на вопрос OP, но я все еще отвечаю здесь, поскольку Google показал этот вопрос, когда я искал "java 8 получить дату начала месяца":)


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;
}