您好,我想在java中做一个程序,其中days,weekNo是参数..Like,每月的第一个星期五或第二个星期一,..and,它返回日期
发布于 2010-11-09 17:21:41
下面是一个执行此操作的实用程序方法,它使用Apache Commons / Lang中的DateUtils
/**
* Get the n-th x-day of the month in which the specified date lies.
* @param input the specified date
* @param weeks 1-based offset (e.g. 1 means 1st week)
* @param targetWeekDay (the weekday we're looking for, e.g. Calendar.MONDAY
* @return the target date
*/
public static Date getNthXdayInMonth(final Date input,
final int weeks,
final int targetWeekDay){
// strip all date fields below month
final Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);
final Calendar cal = Calendar.getInstance();
cal.setTime(startOfMonth);
final int weekDay = cal.get(Calendar.DAY_OF_WEEK);
final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay);
return modifier > 0
? DateUtils.addDays(startOfMonth, modifier)
: startOfMonth;
}测试代码:
// Get this month's third thursday
System.out.println(getNthXdayInMonth(new Date(), 3, Calendar.THURSDAY));
// Get next month's second wednesday:
System.out.println(getNthXdayInMonth(DateUtils.addMonths(new Date(), 1),
2,
Calendar.WEDNESDAY)
);输出:
清华
2010年11月18日00:00:00
2010年12月8日星期三00:00:00 :00
下面是相同代码的JodaTime版本(我以前从未使用过JodaTime,所以可能有一种更简单的方法):
/**
* Get the n-th x-day of the month in which the specified date lies.
*
* @param input
* the specified date
* @param weeks
* 1-based offset (e.g. 1 means 1st week)
* @param targetWeekDay
* (the weekday we're looking for, e.g. DateTimeConstants.MONDAY
* @return the target date
*/
public static DateTime getNthXdayInMonthUsingJodaTime(final DateTime input,
final int weeks,
final int targetWeekDay){
final DateTime startOfMonth =
input.withDayOfMonth(1).withMillisOfDay(0);
final int weekDay = startOfMonth.getDayOfWeek();
final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay);
return modifier > 0 ? startOfMonth.plusDays(modifier) : startOfMonth;
}测试代码:
// Get this month's third thursday
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime(),
3,
DateTimeConstants.THURSDAY));
// Get next month's second wednesday:
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime().plusMonths(1),
2,
DateTimeConstants.WEDNESDAY));输出:
2010-11-18T00:00:00.000+01:00
2010-12-08T00:00:00.000+01:00
发布于 2010-11-09 16:13:40
public static Date getDate(int day, int weekNo, int month, int year) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE,1);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
for (int i = 0; i < 31; i++) {
if (cal.get(Calendar.WEEK_OF_MONTH) == weekNo
&& cal.get(Calendar.DAY_OF_WEEK) == day) {
return cal.getTime();
}
cal.add(Calendar.DATE,1);
}
return null;
}调用代码
System.out.println(""+getDate(Calendar.MONDAY, 2, Calendar.DECEMBER,2010));输出
Mon Dec 06 15:09:00 IST 2010发布于 2017-02-01 05:33:45
tl;dr
LocalDate firstFridayThisMonth =
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.firstInMonth( DayOfWeek.FRIDAY ) )使用java.time
其他的答案现在已经过时了。麻烦的旧date-time类(Date、Calendar等)现在被java.time类取代的是legacy。
LocalDate
LocalDate类表示不带时间和时区的仅日期值。
在确定日期时,时区至关重要。在任何给定的时刻,全球各地的日期都会因地区而异。例如,午夜过后的几分钟在Paris France中是新的一天,而在Montréal Québec中仍然是“昨天”。
指定continent/region格式的proper time zone name,如America/Montreal、Africa/Casablanca或Pacific/Auckland。切勿使用3-4个字母的缩写,例如EST或IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );TemporalAdjuster
TemporalAdjuster接口提供了对日期-时间值的操作。java.time类使用不可变对象,因此结果总是一个新的新对象,其值基于原始对象。
TemporalAdjusters类(注意复数名称)提供了几个方便的实现。其中包括:firstInMonth()、lastInMonth()和dayOfWeekInMonth()。所有这些都带有一个DayOfWeek枚举对象的参数。
LocalDate firstFridayOfThisMonth =
today.with(
TemporalAdjusters.firstInMonth( DayOfWeek.FRIDAY )
)
;…和…
LocalDate secondMondayOfThisMonth =
today.with(
TemporalAdjusters.dayOfWeekInMonth( 2 , DayOfWeek.MONDAY )
)
;…和…
LocalDate thirdWednesdayOfNextMonth =
today.plusMonths( 1 )
.with(
TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.WEDNESDAY )
)
;关于java.time
java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
现在在maintenance mode中的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle Tutorial。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
从哪里获取java.time类?
中的
适用于安卓specifically.
的
ThreeTen-Extra项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和more。
https://stackoverflow.com/questions/4131558
复制相似问题