2010-06-21 125 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的实体会更好,因为它会给你一个添加逻辑的地方。 – 2011-04-20 17:59:41

+0

我同意。我只是作为一个例子写的。 – 2011-04-21 20:03:38

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 – 2015-11-19 07:52:11

+0

你可以试试这个:'LocalDate monthBegin = LocalDate.now()。withDayOfMonth(1); (1).withDayOfMonth(1).minusDays(1);' – MBX 2016-11-02 16:28:15

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 2011-04-06 10:09:38

-1

使之更模块化,你可以有计算的startDate或结束日期一个主要功能,比你可以有个人的方法到getMonthStartDategetMonthEndDategetMonthStartEndDate。根据您的要求使用方法。

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 2017-03-22 16:23:12

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

边注:使用的LocalDate.ofEpochDay(...)代替LocalDate.now()给人大大提高性能。此外,使用毫秒每日表达式而不是结束值(即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()); 

希望它能帮助。从Java 8

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 2016-01-21 07:37:20

5

尝试LOCALDATE的:

LocalDate today = LocalDate.now(); 
System.out.println("First day: " + today.withDayOfMonth(1)); 
System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth())); 
相关问题