2010-06-21 22 views
29

Necesito la fecha de inicio y la fecha de finalización del mes actual en Java. Cuando la página JSP se carga con el mes actual, debe calcular automáticamente la fecha de inicio y finalización de ese mes. Debe ser independientemente del año y mes. Eso es un mes tiene 31 días o 30 días o 28 días. Esto también debería satisfacerse para un año bisiesto. ¿Puedes ayudarme con eso?Fecha de inicio y finalización de un mes actual

Por ejemplo si selecciono el mes de mayo en un cuadro de lista que necesito fecha que es 1 y la fecha de finalización que es 31.

Respuesta

48

Hay partir van:

public Pair<Date, Date> getDateRange() { 
    Date begining, end; 

    { 
     Calendar calendar = getCalendarForNow(); 
     calendar.set(Calendar.DAY_OF_MONTH, 
       calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); 
     setTimeToBeginningOfDay(calendar); 
     begining = calendar.getTime(); 
    } 

    { 
     Calendar calendar = getCalendarForNow(); 
     calendar.set(Calendar.DAY_OF_MONTH, 
       calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 
     setTimeToEndofDay(calendar); 
     end = calendar.getTime(); 
    } 

    return Pair.of(begining, end); 
} 

private static Calendar getCalendarForNow() { 
    Calendar calendar = GregorianCalendar.getInstance(); 
    calendar.setTime(new Date()); 
    return calendar; 
} 

private static void setTimeToBeginningOfDay(Calendar calendar) { 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
} 

private static void setTimeToEndofDay(Calendar calendar) { 
    calendar.set(Calendar.HOUR_OF_DAY, 23); 
    calendar.set(Calendar.MINUTE, 59); 
    calendar.set(Calendar.SECOND, 59); 
    calendar.set(Calendar.MILLISECOND, 999); 
} 

PS: Pair clase es simplemente un par de dos valores

+0

Esto es bueno, pero Pair es una terrible abstracción para un intervalo de fechas. Crear una entidad real llamada DateRange sería mucho mejor, ya que le daría un lugar para agregar lógica. –

+0

Estoy de acuerdo. Escribí esto solo como un ejemplo. –

25

Si tiene la opción, será mejor que evite la horrible API Java Date, y use en su lugar Jodatime. Aquí está un ejemplo:

LocalDate monthBegin = new LocalDate().withDayOfMonth(1); 
LocalDate monthEnd = new LocalDate().plusMonths(1).withDayOfMonth(1).minusDays(1); 
+1

Ahora, con java 8 puedes hacerlo con Java time: https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html –

+0

Puedes probar esto: 'LocalDate monthBegin = LocalDate.now(). WithDayOfMonth (1); LocalDate monthEnd = LocalDate.now(). PlusMonths (1) .withDayOfMonth (1) .minusDays (1); ' – MBX

3

Con la biblioteca date4j:

dt.getStartOfMonth(); 
dt.getEndOfMonth(); 
2
Date begining, ending; 
Calendar calendar_start =BusinessUnitUtility.getCalendarForNow(); 
    calendar_start.set(Calendar.DAY_OF_MONTH,calendar_start.getActualMinimum(Calendar.DAY_OF_MONTH)); 
    begining = calendar_start.getTime(); 
    String start= DateDifference.dateToString(begining,"dd-MMM-yyyy");//sdf.format(begining); 


    //   for End Date of month 
    Calendar calendar_end = BusinessUnitUtility.getCalendarForNow(); 
    calendar_end.set(Calendar.DAY_OF_MONTH,calendar_end.getActualMaximum(Calendar.DAY_OF_MONTH)); 
     ending = calendar_end.getTime(); 
     String end=DateDifference.dateToString(ending,"dd-MMM-yyyy");//or sdf.format(end); 

enter code here 



public static Calendar getCalendarForNow() { 
     Calendar calendar = GregorianCalendar.getInstance(); 
     calendar.setTime(new Date()); 
     return calendar; 
    } 
+0

Este código será útil para obtener la fecha de inicio y la fecha de finalización del mes actual – paks

-1

Por lo que es más modular, que puede tener una función principal que calcula startDate o EndDate y de lo que puede tener métodos individuales a getMonthStartDate, getMonthEndDate y al getMonthStartEndDate. Use métodos según su requisito.

public static String getMonthStartEndDate(){ 
    String start = getMonthDate("START"); 
    String end = getMonthDate("END"); 
    String result = start + " to " + end; 
    return result; 
} 

public static String getMonthStartDate(){ 
    String start = getMonthDate("START"); 
    return start; 
} 

public static String getMonthEndDate(){ 
    String end = getMonthDate("END"); 
    return end; 
} 

/** 
* @param filter 
* START for start date of month e.g. Nov 01, 2013 
* END for end date of month e.g. Nov 30, 2013 
* @return 
*/ 
public static String getMonthDate(String filter){ 
      String MMM_DD_COMMA_YYYY  = "MMM dd, yyyy"; 
    SimpleDateFormat sdf = new SimpleDateFormat(MMM_DD_COMMA_YYYY); 
    sdf.setTimeZone(TimeZone.getTimeZone("PST")); 
    sdf.format(GregorianCalendar.getInstance().getTime()); 

    Calendar cal = GregorianCalendar.getInstance(); 
    int date = cal.getActualMinimum(Calendar.DATE); 
    if("END".equalsIgnoreCase(filter)){ 
     date = cal.getActualMaximum(Calendar.DATE); 
    } 
    cal.set(Calendar.DATE, date); 
    String result = sdf.format(cal.getTime()); 
    System.out.println(" " + result ); 

    return result; 
} 
+0

Motivo del voto a favor, por favor? :) – ManishKr

0

Para Java 8+, a continuación método determinado del mes actual primeras & últimas fechas como instancias 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); 
} 

Nota al margen: El uso de LocalDate.ofEpochDay(...) en lugar de LocalDate.now() da rendimiento muy mejorado. Además, al usar la expresión millis-in-a-day en lugar del valor final, que es 86400000, tiene un mejor rendimiento. Al principio me pareció el último sería un mejor desempeño que el de la expresión: P

1

Prueba este Código

Calendar calendar = Calendar.getInstance(); 
int yearpart = 2010; 
int monthPart = 11; 
int dateDay = 1; 
calendar.set(yearpart, monthPart, dateDay); 
int numOfDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
System.out.println("Number of Days: " + numOfDaysInMonth); 
System.out.println("First Day of month: " + calendar.getTime()); 
calendar.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1); 
System.out.println("Last Day of month: " + calendar.getTime()); 

espero que ayude.

1
Calendar c = Calendar.getInstance(); 
    int year = c.get(Calendar.YEAR); 
    int month = c.get(Calendar.MONTH); 
    int day = 1; 
    c.set(year, month, day); 
    int numOfDaysInMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH); 
    System.out.println("First Day of month: " + c.getTime()); 
    c.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1); 
    System.out.println("Last Day of month: " + c.getTime()); 
+0

Como hay muchas otras respuestas e incluso una aceptada, debe proporcionar un poco de razonamiento, lo que distingue su respuesta de las demás. – hotzst

5

Try LocalDate desde Java 8:

LocalDate today = LocalDate.now(); 
System.out.println("First day: " + today.withDayOfMonth(1)); 
System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth())); 
Cuestiones relacionadas