我需要获取自创建日期以来经过的天数。这个数字需要减去周末。我只有一些函数:JulianDay、JulianWeek、JulianYear 来获取 Julian 日期值,我还有 Today 返回今天的日期,时间戳返回日期和时间。我已经设法通过使用获得今天创建日期的差异: JulianDay(today)-JulianDay(creation date) 但我仍然无法绕过减去周末
3 回答
不完全确定您在问题中引用的函数是做什么的,但是,您似乎对使用基本日期算术来确定两个给定日期之间的天数感到满意。困难的部分似乎是弄清楚周末要减去多少天。
我认为您可以通过两个功能来完成此操作:
- 给定两个日期,返回它们之间的天数。调用这个
DAYS(date-1, date-2)
- 给定日期,返回星期几(其中 1 = 星期一 ... 7 = 星期日)。调用这个
DAY-OF-WEEK(date)
拥有这些功能后,您可以执行以下操作:
- 计算日期范围内的整周:
WEEKS = DAYS(date-1, date2) mod 7
- 计算天数而不是整周的一部分:
DAYS-LEFT = DAYS(date-1, date-2) - (WEEKS * 7)
- 确定最后一天是一周中的哪一天:
LAST-DAY = DAY-OF-WEEK(date-2)
调整DAYS-LEFT
部分周数如下:
if DAYS-LEFT > 0 then
case LAST-DAY
when 6 then /* Saturday */
DAYS-LEFT = DAYS-LEFT - 1
when 7 then /* Sunday */
if DAYS-LEFT = 1 then
DAYS-LEFT = 0
else
DAYS-LEFT = DAYS-LEFT - 2
end-if
when other /* Monday through Friday */
case DAYS-LEFT - LAST-DAY
when > 1 then
DAYS-LEFT = DAYS-LEFT - 2
when = 1 then
DAYS-LEFT = DAYS-LEFT - 1
when other
DAYS-LEFT = DAYS-LEFT /* no adjustment */
end-case
end-case
end-if
DAYS-EXCLUDING-WEEKENDS = DAYS(date-1, date-2) - (WEEKS * 2) + DAYS-LEFT
我假设您拥有或可以构建一个DAYS(date-1, date-2)
功能。下一位是确定给定日期在一周中的哪一天。执行此操作的算法称为Zeller's congruence。我不会在这里重复该算法,因为 Wikipedia 对它的描述做得很好。
希望这能让你上路……
您的JulianDay(y,m,d)
函数返回每个日期的序列号;假设为了讨论JulianDay(2013,7,4)
返回 2456478。第二天将是 2456479,然后是 2456480,依此类推。假设两天的差异是diff。
diff中的完整周数,每个包含 5 个工作日,是diff // 7
(这是整数除法,所以它向下舍入)。因此,如果diff为 25,则将有25 // 7 = 3
整周加上额外的diff % 7 = 4
天数。整整 3 周包含 15 个工作日;从一周中的哪一天开始并不重要。因此,您只需要考虑额外的 4 天就可以了解工作日的情况。
函数返回的数字JulianDay
可以取模 7 来计算星期几;在我的JulianDay
函数中,模 5 代表星期六,模 6 代表星期日。您可以将额外的 4 天作为周期开始的 4 天或结束的 4 天;没关系,因为所有其他日子都是连续整周的一部分,每个周都有 5 个工作日。假设您选择前 4 天。然后取JulianDay
第一天的模7,然后JulianDay
第一天的加1模7,然后JulianDay
第一天的加2模7,然后JulianDay
第一天的加3模7,确定其中有多少是工作日,并将其添加到整周的工作日数中。
你所需要的只是一个JulianDay
函数。
这段代码应该做你想做的事:
Date fromDate = new Date(System.currentTimeMillis()-(30L*24*60*60*1000)); // 30 days ago
Date toDate = new Date(System.currentTimeMillis()); // now
Calendar cal = Calendar.getInstance();
cal.setTime(fromDate);
int countDays = 0;
while (toDate.compareTo(cal.getTime()) > 0) {
if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
countDays++;
cal.add(Calendar.DATE, 1);
}
System.out.println(countDays);