2010-06-21 10 views
29

J'ai besoin de la date de début et de la date de fin du mois en cours en Java. Lorsque la page JSP est chargée avec le mois en cours, elle doit automatiquement calculer la date de début et de fin de ce mois. Cela devrait être indépendamment de l'année et du mois. C'est un mois a 31 jours ou 30 jours ou 28 jours. Cela devrait satisfaire pour une année bissextile aussi. Pouvez-vous m'aider avec ça?Date de début et de fin d'un mois en cours

Par exemple, si je choisis le mois de mai dans une zone de liste je besoin la date de départ qui est 1 et date de fin est le 31

Répondre

48

Là vous allez:

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: classe Pair est tout simplement une paire de deux valeurs.

+0

Ce qui est bon, mais une terrible paire est l'abstraction pour une plage de dates. Créer une entité réelle appelée DateRange serait beaucoup mieux car cela vous donnerait un endroit pour ajouter de la logique. –

+0

Je suis d'accord. J'ai écrit ceci à titre d'exemple. –

25

Si vous avez l'option, vous feriez mieux d'éviter l'horrible Java Date API, et utilisez plutôt Jodatime. Voici un exemple:

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

Maintenant, avec Java 8, vous pouvez le faire avec le temps java: https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html –

+0

Vous pouvez essayer ceci: 'LocalDate monthBegin = LocalDate.now(). AvecDayOfMonth (1); LocalDate monthEnd = LocalDate.now(). PlusMonths (1) .withDayOfMonth (1) .minusDays (1); ' – MBX

3

Avec la bibliothèque 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

ce code vous aidera à obtenir la date de début et la date de fin du mois en cours – paks

-1

Faire plus modulaire, vous pouvez avoir une fonction principale qui calcule startDate ou EndDate et que vous pouvez avoir des méthodes individuelles à getMonthStartDate, getMonthEndDate et à getMonthStartEndDate. Utilisez des méthodes selon vos besoins.

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

Raison de la sous-estimation s'il vous plaît? :) – ManishKr

0

Pour Java 8+, ci-dessous méthode sera donné le mois en cours & premières dates dernières que les instances 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); 
} 

Side note: À l'aide LocalDate.ofEpochDay(...) au lieu de LocalDate.now() donne beaucoup de meilleures performances. En outre, l'utilisation de l'expression millis-in-a-day au lieu de la valeur de fin, qui est 86400000 fonctionne mieux. Je pensais d'abord ce dernier exécuteraient mieux que l'expression: P

1

Essayez ce Code

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

Hope it helps.

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

Comme il y a plusieurs autres réponses et même une réponse acceptée, vous devez fournir un peu de raisonnement, ce qui distingue votre réponse des autres. – hotzst

5

Essayez LocalDate de Java 8:

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