给出一年零一个月;我想得到两个Date Objects
。一个月份为startDate
,另一个月份为end Date
。我在这里实现了它,它的工作原理。但这看起来太冗长了,我想知道是否有一个简洁的解决方案;
例如2014年3月,
开始日期将是3月1日,结束日期将是3月31日(精确到Date objects
毫秒)
public setDates(int month,int year) {
Calendar calendar = Calendar.getInstance();
// Use the calendar to get the startDate and endDate of this Invoice.
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH,month);
//set start date
calendar.set(Calendar.DAY_OF_MONTH,
calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY,
calendar.getActualMinimum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE,
calendar.getActualMinimum(Calendar.MINUTE));
calendar.set(Calendar.SECOND,
calendar.getActualMinimum(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND,
calendar.getActualMinimum(Calendar.MILLISECOND));
this.startDate = calendar.getTime();
//endDate start date
calendar.set(Calendar.DAY_OF_MONTH,
calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY,
calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE,
calendar.getActualMaximum(Calendar.MINUTE));
calendar.set(Calendar.SECOND,
calendar.getActualMaximum(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND,
calendar.getActualMaximum(Calendar.MILLISECOND));
this.endDate = calendar.getTime();
}
答案 0 :(得分:5)
通过做出一些假设,您可以使此代码更加简单:
然后,您可以通过添加一个月并减去毫秒来找到该月的最后一毫秒。
所以代码看起来像这样:
// Note year/month reversal: try to consistently use larger units first. It
// makes for a cleaner API.
public setDates(int year, int month, TimeZone zone) {
Calendar calendar = Calendar.getInstance(zone);
// Do you really want 0-based months, like Java has? Consider month - 1.
calendar.set(year, month, 1, 0, 0, 0);
calendar.clear(Calendar.MILLISECOND);
startDate = calendar.getTime();
// Get to the last millisecond in the month
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.MILLISECOND, -1);
endDate = calendar.getTime();
}
要使用独占上限(正如我所推荐的那样),只需摆脱最后的calendar.add(Calendar.MILLISECOND, -1)
。
哦,我完全建议使用Joda Time代替java.util.Date
等 - 这是很多更干净的API。
答案 1 :(得分:0)
3月1日。在月份字段中添加1。然后减去1天 这是你这个月的最后一天。
第一天很清楚,这是一年中的第一天。
详细是可以的,没有那么冗长的代码版本 (在JDK< = 7中),如果你坚持使用Java的内置库。
答案 2 :(得分:0)
请使用JODA。
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Period;
public class Dates {
/**
* @param args
*/
public static void main(String[] args) {
//without JODA
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Helsinki"));
calendar.set(1921, 4, 1, 0, 0, 0);
calendar.clear(Calendar.MILLISECOND);
Date startDate = calendar.getTime();
System.out.println(startDate);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.MILLISECOND, -1);
Date endDate = calendar.getTime();
System.out.println(endDate);
/*
* Sat Apr 30 19:20:08 BRT 1921
* Tue May 31 19:20:07 BRT 1921
*/
//with JODA
DateTimeZone zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Europe/Helsinki"));
DateTime dt = new DateTime(1921, 4, 1, 0, 0, 0, 0, zone);
DateTime plusPeriod = dt.plus(Period.months(1)).minus(Period.millis(1));
System.out.println(dt);
System.out.println(plusPeriod);
/*
* 1921-04-01T00:00:00.000+01:39:52
* 1921-04-30T23:59:59.999+01:39:52
*/
}
}