2010-06-21 2 views
29

Мне нужна дата начала и дата окончания текущего месяца на Java. Когда страница JSP загружается с текущим месяцем, она должна автоматически рассчитывать дату начала и окончания этого месяца. Он должен быть независимо от года и месяца. В этом месяце есть 31 день или 30 дней или 28 дней. Это должно удовлетворять и в високосном году. Можете ли вы мне помочь?Начальная и конечная дата текущего месяца

Например, если выбрать месяц май в окне списка мне нужно, начиная дату, которая 1 и дата окончания, которое 31.

ответ

48

Там вы идете:

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 класс просто пара двух значений.

+0

Это хорошо, но пара страшная абстракция для диапазона дат. Создание реального объекта под названием DateRange было бы намного лучше, так как это дало бы вам место для добавления логики. –

+0

Согласен. Я написал это как пример. –

25

Если у вас есть этот параметр, лучше избегать ужасного Java Date API и вместо этого использовать Jodatime. Вот пример:

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

Теперь с помощью java 8 вы можете сделать это с помощью java-времени: https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html –

+0

Вы можете попробовать следующее: 'LocalDate monthBegin = LocalDate.now(). WithDayOfMonth (1); LocalDate monthEnd = LocalDate.now(). PlusMonths (1) .withDayOfMonth (1) .minusDays (1); ' – MBX

3

С 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

Этот код поможет получить начальную дату и дату окончания текущего месяца – paks

-1

делает его более модульным, вы можете иметь одну главную функцию, которая вычисляет STARTDATE или EndDate и чем вы можете иметь индивидуальные методы до getMonthStartDate, getMonthEndDate и до getMonthStartEndDate. Используйте методы согласно вашему требованию.

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

Причина для downvote? :) – ManishKr

0

Для 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); 
} 

Side Примечание: Использование LocalDate.ofEpochDay(...) вместо LocalDate.now() дает значительно улучшенную производительность. Кроме того, использование выражения millis-in-day вместо конечного значения, которое составляет 86400000, работает лучше. Первоначально я думал, что последнее будет работать лучше, чем выражение: P

1

Попробуйте этот код

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

Надеется, что это помогает.

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

Поскольку есть несколько других ответов и даже принятых, вы должны дать немного рассуждений, что отличает ваш ответ от других. – hotzst

5

Try LocalDate из Java 8:

LocalDate today = LocalDate.now(); 
System.out.println("First day: " + today.withDayOfMonth(1)); 
System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth())); 
Смежные вопросы