本月的开始日期和结束日期
我需要Java中当前月份的开始日期和结束日期。当JSP页面使用当前月份加载时,它应该自动计算该月份的开始日期和结束日期。它应该与年月无关。这是一个月有31天或30天或28天。这也应该满足闰年。你能帮我解决吗?本月的开始日期和结束日期
例如,如果我在一个列表框中我需要开始日期是1和结束日期为31
有选择的五月,你去:
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
类是根本一对两个值。
如果您有选择,您最好避免使用可怕的Java Date API,并改用Jodatime。这里有一个例子:
LocalDate monthBegin = new LocalDate().withDayOfMonth(1);
LocalDate monthEnd = new LocalDate().plusMonths(1).withDayOfMonth(1).minusDays(1);
现在,用java 8,你可以用java时间完成这个工作:https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html – 2015-11-19 07:52:11
你可以试试这个:'LocalDate monthBegin = LocalDate.now()。withDayOfMonth(1); (1).withDayOfMonth(1).minusDays(1);' – MBX 2016-11-02 16:28:15
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;
}
这段代码将有助于获取本月的开始日期和结束日期 – paks 2011-04-06 10:09:38
使之更模块化,你可以有计算的startDate或结束日期一个主要功能,比你可以有个人的方法到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;
}
downvote请原因? :) – ManishKr 2017-03-22 16:23:12
对于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
试试这个代码
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
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());
由于还有很多其他答案,甚至是一个被接受的答案,你应该提供一些推理,什么区别你的答案和其他答案。 – hotzst 2016-01-21 07:37:20
尝试LOCALDATE的:
LocalDate today = LocalDate.now();
System.out.println("First day: " + today.withDayOfMonth(1));
System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth()));
这是好事,但对是的日期范围可怕的抽象。创建一个名为DateRange的实体会更好,因为它会给你一个添加逻辑的地方。 – 2011-04-20 17:59:41
我同意。我只是作为一个例子写的。 – 2011-04-21 20:03:38