如果我有一个事件的日期,例如2011-01-03,如何检测它是在这个或下周的java中?任何示例代码?
编辑:
我认为这是一个简单的问题,结果比我想象的要复杂得多,本周我吃的是:从过去的太阳到本周六,下周是从下一个太阳到周六之后。
答案 0 :(得分:7)
这在一定程度上取决于你对“本周”和“下周”的意思......但是Joda Time很容易确定它是在“今天还是未来7天”,因为它是:
LocalDate event = getDateFromSomewhere();
LocalDate today = new LocalDate();
LocalDate weekToday = today.plusWeeks(1);
LocalDate fortnightToday = weekToday.plusWeeks(1);
if (today.compareTo(event) <= 0 && event.compareTo(weekToday) < 0)
{
// It's within the next 7 days
}
else if (weekToday.compareTo(event) <= 0 && event.compareTo(fornightToday) < 0)
{
// It's next week
}
编辑:要获得星期日到星期六的周,你可能想要:
LocalDate startOfWeek = new LocalDate().withDayOfWeek(DateTimeConstants.SUNDAY);
然后执行与上面相同的代码,但相对于startOfWeek
。
答案 1 :(得分:2)
这个怎么样:
Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss");
System.out.println(df.format(c.getTime())); // This past Sunday [ May include today ]
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime())); // Next Sunday
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime())); // Sunday after next
结果:
Sun 2010/12/26 00:00:00
Sun 2011/01/02 00:00:00
Sun 2011/01/09 00:00:00
前两天之间的任何一天都是本周,最后两周之间的任何一天都是下周。
答案 2 :(得分:2)
尽管有一个老问题-仍然有意义。这里最受支持的答案是对Joda-time的正确写法,对JDK8的正确写法,以及一些语法更改。这可能会帮助那些在JDK8世界中环顾四周的人。
public static boolean isLocalDateInTheSameWeek(LocalDate date1, LocalDate date2) {
LocalDate sundayBeforeDate1 = date1.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
LocalDate saturdayAfterDate1 = date1.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY));
return ((date2.isEqual(sundayBeforeDate1) || date2.isAfter(sundayBeforeDate1))
&& (date2.isEqual(saturdayAfterDate1) || date2.isBefore(saturdayAfterDate1)));
}
答案 3 :(得分:1)
提示:使用日历。为您的示例事件日期创建它的新实例。然后,将WEEK_OF_YEAR与当前日期和事件日期进行比较。
答案 4 :(得分:1)
对于那些必须坚持JDK 7并且不能使用joda.time的人,我编写了这个方法并进行了测试。
public static boolean inSameWeek(Date date1, Date date2) {
if (null == date1 || null == date2) {
return false;
}
Calendar earlier = Calendar.getInstance();
Calendar later = Calendar.getInstance();
if (date1.before(date2)) {
earlier.setTime(date1);
later.setTime(date2);
} else {
earlier.setTime(date2);
later.setTime(date1);
}
if (inSameYear(date1, date2)) {
int week1 = earlier.get(Calendar.WEEK_OF_YEAR);
int week2 = later.get(Calendar.WEEK_OF_YEAR);
if (week1 == week2) {
return true;
}
} else {
int dayOfWeek = earlier.get(Calendar.DAY_OF_WEEK);
earlier.add(Calendar.DATE, 7 - dayOfWeek);
if (inSameYear(earlier.getTime(), later.getTime())) {
int week1 = earlier.get(Calendar.WEEK_OF_YEAR);
int week2 = later.get(Calendar.WEEK_OF_YEAR);
if (week1 == week2) {
return true;
}
}
}
return false;
}
public static boolean inSameYear(Date date1, Date date2) {
if (null == date1 || null == date2) {
return false;
}
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
int year1 = cal1.get(Calendar.YEAR);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
int year2 = cal2.get(Calendar.YEAR);
if (year1 == year2)
return true;
return false;
}
答案 5 :(得分:1)
这里的大多数答案都不令我满意。他们要么使用过时的Calendar
-API(可在Java 8之前的时代给出的旧答案中辩解,因此批评这样的答案是不公平的),或者它们甚至是部分错误或不必要的复杂。例如,乔恩·斯凯特(Jon Skeet)最受争议的答案建议由Joda表达式new LocalDate().withDayOfWeek(DateTimeConstants.SUNDAY)
确定一周的第一天。但是这样的代码使用从星期一开始的一周的ISO定义,结果是,如果当前日期不在星期日,则该代码将生成下一个星期日,而不是OP所希望的前一个星期日。 Joda-Time无法处理非ISO周。
其他答案的另一个次要缺陷是不必关心当前AND NEXT周是否包含给定日期(如OP所要求的那样)。因此,我在现代Java中提出了改进的建议:
LocalDate today = LocalDate.now(); // involves the system time zone and clock of system
LocalDate startOfCurrentWeek =
today.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
LocalDate endOfNextWeek =
startOfCurrentWeek.plusDays(13);
LocalDate event = LocalDate.of(2011, 1, 3); // input of example given by OP
boolean matchingResult =
!(event.isBefore(startOfCurrentWeek) || event.isAfter(endOfNextWeek));
旁注:这个问题启发了我在图书馆small enhancement的班级DateInterval
中添加Time4J到如何以一种非常通用的方式确定当前日历周。 >
答案 6 :(得分:1)
这是在Java 8中对我有用的
import java.time.LocalDate;
LocalDate today = LocalDate.now();
LocalDate twoWeeksBefore = today.minusWeeks(2);
LocalDate checkDate = someObject.getSomeDate();
if(checkDate.compareTo(twoWeeksBefore) > 0) {
// do something if checkDate is within last two weeks
} else {
// do something if checkDate is on or before last two weeks
}
答案 7 :(得分:0)
您可以使用Calendar API检索指定日期的一周。
Calendar cal = Calendar.getInstance();
cal.setTime(somedate);
int week = cal.get(Calendar.WEEK_OF_YEAR);
答案 8 :(得分:0)
使用LocalDate
类和名为org.threeten.extra.LocalDateRange
的{{1}}类来确定一对TemporalAdjuster
对象,这些对象确定一周中的第一天。
ta
ThreeTen-Extra项目为Java内置的 java.time 类(由JSR 310定义)添加了附加功能。
在添加的类中有LocalDateRange
。此类表示时间轴上的时间跨度。换句话说,一对 LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.contains(
localDate2
)
对象。此类提供了方便的比较方法,例如LocalDate
,overlaps
和contains
。这里我们需要equals
。
定义一个方法,在其中传递两个日期以及一周中的第一天(一个DayOfWeek
枚举对象)。
我们使用TemporalAdjusters
类中的abuts
来确定一周中第一天的日期。然后添加一个星期以得出星期的结束时间(按照时间跨度的半开放定义)。
我们可能很可爱,请检查两个日期是否相同。是否值得在您的应用中经常检查这种情况是否值得。
在第2周,让我们使用单行代码作为替代语法。
TemporalAdjuster
或更紧凑。
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
LocalDate weekStart1 = localDate1.with( ta ) ;
LocalDate weekStop1 = weekStart1.plusWeeks( 1 ) ;
LocalDateRange week1 = LocalDateRange.of( weekStart1 , weekStop1 ) ;
LocalDateRange week2 =
LocalDateRange.of(
localDate2.with( ta ) ,
localDate2.with( ta ).plusWeeks( 1 )
)
;
// Compare the weeks.
return week1.equals( week2 ) ;
}
我们真的不需要第二个星期。我们只关心第一个确定的星期contains是第二个传递日期参数。
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
return
LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.equals(
LocalDateRange.of(
localDate2.with( ta ) ,
localDate2.with( ta ).plusWeeks( 1 )
)
)
;
}
使用它。
public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
Objects.requireNonNull( localDate1 ) ; // … ditto for other arguments.
if( localDate1.isEqual( localDate2 ) ) { return true ; }
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
return
LocalDateRange.of(
localDate1.with( ta ) ,
localDate1.with( ta ).plusWeeks( 1 )
)
.contains(
localDate2
)
;
}
注意:我没有运行这段代码。