我要求获得自创建日期以来经过的天数。这个数字需要减去周末。我只有一些功能:JulianDay,JulianWeek,JulianYear获得Julian日期值,我也有今天返回今天的日期,时间戳返回日期和时间。我已经设法通过使用:JulianDay(今天)-JulianDay(创建日期)来获得今天创建日期的差异但我仍然无法绕过减去周末
答案 0 :(得分:2)
不完全确定您在问题中引用的功能是什么,但是,您似乎对此感到满意 执行基本日期算术以确定两个给定日期之间的天数。困难的部分似乎 要弄明白周末可以减去几天。
我认为你可以用两个功能完成这个任务:
DAYS(date-1, date-2)
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。我不会
这里重复算法,因为维基百科在描述它时做得很好。
希望这能让你顺利上路......
答案 1 :(得分:1)
您的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天。然后取第7天的JulianDay
模7,然后是第一天的JulianDay
加上1模7,然后是第一天的JulianDay
再加上2模7,那么{ {1}}第一天加3模7,确定其中有多少是工作日,并将其添加到整周的工作日数。
您只需要一个JulianDay
功能。
答案 2 :(得分:0)
此代码应该按您的要求执行:
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);