使用 GregorianCalendar 获取周数
Using GregorianCalendar to get weeks
我希望利用 GregorianCalendar 根据天数执行一些逻辑。有什么方法可以查看 2 个日期是否在同一周内?我试过使用 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();
这将为我们提供两个日期,第一个从 "start of the week" 开始,另一个在 6 天后("end of the week")。我们将时间值强制到天数的极端,以确保我们可以捕获下降范围
接下来,我们需要确定其他日期是否等于或晚于 "start of the week" 且等于或早于 "end of the week",例如...
(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();
}
这 returns 是包含特定 Calendar
的一周的第一天 Date
。然后你可以像这样检查两个日历是否在同一周。
if (firstOfWeek(cal1).equals(firstOfWeek(cal2))) {
...
}
我希望利用 GregorianCalendar 根据天数执行一些逻辑。有什么方法可以查看 2 个日期是否在同一周内?我试过使用 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();
这将为我们提供两个日期,第一个从 "start of the week" 开始,另一个在 6 天后("end of the week")。我们将时间值强制到天数的极端,以确保我们可以捕获下降范围
接下来,我们需要确定其他日期是否等于或晚于 "start of the week" 且等于或早于 "end of the week",例如...
(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();
}
这 returns 是包含特定 Calendar
的一周的第一天 Date
。然后你可以像这样检查两个日历是否在同一周。
if (firstOfWeek(cal1).equals(firstOfWeek(cal2))) {
...
}