繁体   English   中英

使用GregorianCalendar获得星期

[英]Using GregorianCalendar to get weeks

我正在寻找利用GregorianCalendar基于天做一些逻辑。 有什么办法可以查看同一星期是否有两个日期? 我尝试使用get(Calendar.WEEK_OF_YEAR) ,这有两个缺点:

1)从错误的星期几开始(在setFirstDayOfWeek似乎有潜在的解决方案,但是初步测试未成功。
2)这种解决方案不能很好地进行数年。 例如,2014年12月30日和2015年1月1日应该在同一周。

有没有不需要切换库的解决方案吗?

您的问题基本上可以归结为确定给定日期是否在给定日期范围内(即一周)。

这背后的想法基本上是两个日期中的一个作为锚点,我们从中计算日期范围(一周的开始到一周的结束),然后确定另一个日期是否在该范围内。

因此,首先,我们需要计算日期范围,例如...

Calendar cal = Calendar.getInstance();
cal.setTime(date1);
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
Date startOfWeek = cal.getTime();

cal.add(Calendar.DATE, 6);
cal.set(Calendar.HOUR_OF_DAY, 23); 
cal.set(Calendar.MINUTE, 59); 
cal.set(Calendar.SECOND, 59); 
cal.set(Calendar.MILLISECOND, 999); 
Date endOfWeek = cal.getTime();

这将给我们两个日期,第一个日期从“一周的开始”开始,一个六天后(“一周的结束”)开始。 我们将时间值设置为极端,以确保能够捕获下降范围

接下来,我们需要确定另一个日期是否等于或大于“一周的开始”,并且等于或大于“一周的结束”,例如...

(date2.equals(startOfWeek) || date2.after(startOfWeek)) && (date2.equals(endOfWeek) || date2.before(endOfWeek));

然后可以用一种不错的小方法将其包装起来,以使其更简单...

public static boolean isInSameWeek(Date date1, Date date2) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date1);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);

    cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
    Date startOfWeek = cal.getTime();

    cal.add(Calendar.DATE, 6);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999);
    Date endOfWeek = cal.getTime();

    System.out.println("Week starts at : " + startOfWeek);
    System.out.println("  Week ends at : " + endOfWeek);

    return (date2.equals(startOfWeek) || date2.after(startOfWeek)) && (date2.equals(endOfWeek) || date2.before(endOfWeek));

}

然后我们可以对其进行测试...

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
    Date date1 = sdf.parse("30/12/2014");
    Date date2 = sdf.parse("1/1/2015");

    System.out.println("Is in same week " + date1 + "/" + date2 + " = " + isInSameWeek(date1, date2));
    System.out.println("");

    date1 = sdf.parse("27/12/2014");
    System.out.println("Is in same week " + date1 + "/" + date2 + " = " + isInSameWeek(date1, date2));
} catch (ParseException exp) {
    exp.printStackTrace();
}

输出类似...

Week starts at : Sun Dec 28 00:00:00 EST 2014
  Week ends at : Sat Jan 03 23:59:59 EST 2015
Is in same week Tue Dec 30 00:00:00 EST 2014/Thu Jan 01 00:00:00 EST 2015 = true

Week starts at : Sun Dec 21 00:00:00 EST 2014
  Week ends at : Sat Dec 27 23:59:59 EST 2014
Is in same week Sat Dec 27 00:00:00 EST 2014/Thu Jan 01 00:00:00 EST 2015 = false

好的,因为您已经说过会有时间成分,所以我将使用与@MadProgrammer的答案类似的方法,但不会使用整个日期范围的复杂性。 我会有这样的静态方法。

public static Date firstOfWeek(Calendar cal) {
    Calendar copy = new GregorianCalendar( 
        cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
    copy.set(Calendar.DAY_OF_WEEK, copy.getFirstDayOfWeek());
    return copy.getTime();
}

这将返回包含特定Calendar的一周中第一天的Date 然后,您可以像这样检查两个日历是否在同一周。

if (firstOfWeek(cal1).equals(firstOfWeek(cal2))) {
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM