让我们看看你是否可以帮助我。我希望在两个日期d1和d2之间获得周数(从星期一开始,在星期日结束)。让我们假设d2早于d1。代码的那部分已经编程并正常工作。我现在的问题是我无法正确编写周程序。这就是我现在所做的:
public static void getFullWeeks(Calendar d1, Calendar d2){
int Weeks = 0;
Calendar date2 = d2;
Calendar addWeek = GregorianCalendar.getInstance();
addWeek.setTime(date2.getTime());
addWeek.add(Calendar.DATE, 6);
while(addWeek.before(d1) || addWeek.equals(d1)){
if(date2.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){
Weeks++;
}
date2.add(Calendar.DATE,1);
}
System.out.println(
"The number of weeks (from monday to sunday) between both dates are: "
+ Weeks);
}
但输出是" 0周",所以该程序无效。怎么了?我没有遇到错误,而且我无法找到解决此问题的有效方法。
谢谢!
答案 0 :(得分:2)
在没有外部库的Java 8中,您可以执行以下操作:
*编辑周一开始的一周帐户
// TechTrip - ASSUMPTION d1 is earlier than d2
// leave that for exercise
public static long getFullWeeks(Calendar d1, Calendar d2){
// In Java the week starts on Sunday from an integral perspective
// public final static int SUNDAY = 1;
// SEQUENTIAL UP TO
// public final static int SATURDAY = 7;
// make the starting date relative to the Monday we need to calculate from
int dayOfStartWeek = d1.get(Calendar.DAY_OF_WEEK);
// IF we have a partial week we should add an offset that moves the start
// date UP TO the next Monday to simulate a week starting on Monday
// eliminating partial weeks from the calculation
// NOTE THIS METHOD WILL RETURN NEGATIVES IF D1 < D2 after adjusting for
// offset
if (dayOfStartWeek == Calendar.SUNDAY) {
// add an offset of 1 day because this is a partial week
d1.add(Calendar.DAY_OF_WEEK, 1);
} else if (dayOfStartWeek != Calendar.MONDAY){
// add an offset for the partial week
// Hence subtract from 9 accounting for shift by 1
// and start at 1
// ex if WEDNESDAY we need to add 9-4 (WED Int Val) = 5 days
d1.add(Calendar.DAY_OF_WEEK, 9 - dayOfStartWeek);
}
Instant d1i = Instant.ofEpochMilli(d1.getTimeInMillis());
Instant d2i = Instant.ofEpochMilli(d2.getTimeInMillis());
LocalDateTime startDate = LocalDateTime.ofInstant(d1i, ZoneId.systemDefault());
LocalDateTime endDate = LocalDateTime.ofInstant(d2i, ZoneId.systemDefault());
return ChronoUnit.WEEKS.between(startDate, endDate);
}
这是主要的:
public static void main(String[] args) {
Calendar d1 = Calendar.getInstance();
Calendar d2 = Calendar.getInstance();
d2.add(Calendar.WEEK_OF_YEAR, 6);
System.out.println(
"The number of weeks (from monday to sunday) between both dates are: "
+ getFullWeeks(d1, d2));
}
如果开始日期是星期一,则输出如下:
两个日期之间的周数(从星期一到星期日)是:6
注意,我没有将日期d2指定给d1,使其成为相同的参考。在这种情况下,你会得到0。
* ChronoUnit采用Temporal,它只是一个日期,时间或偏移量。它们必须属于同一类型。时间可以用加号和减号来操纵。
答案 1 :(得分:1)
在我看来,你犯了几个小错误:
1。)你的输出是0周,因为你的代码中的其他地方你必须使用第一个参数d1
调用此方法,而不是第二个参数,而在方法体中,你假设{{1早于d2
。使用有意义的参数名称可以轻松避免此类错误。在这种情况下,适当的参数名称例如是d1
和start
。
2)如果使用end
早于d2
的参数执行此方法,则您的方法将陷入无限循环。我认为添加到d1
不会更改date2
中的日期。
3)您的方法计算从星期二到星期一而不是星期一到星期日的星期数。要解决此问题,请将{7}添加至addWeek
而不是6天,或更改while循环以仅检查addWeek
是否在addWeek
之前,并在星期日增加d1
。
把所有这些放在一起,我相信这会给你你想要的东西:
weeks
答案 2 :(得分:0)
你的算法错了;你的while
循环需要比较你正在修改的同一个Calendar对象,但你不这样做,所以要么你有一个无限循环,要么你立即退出返回值为0,这取决于addDate是否是在d1之前或之后(因为两者都没有变化)。你的代码应该是:
public static void getFullWeeks(Calendar d1, Calendar d2){
int Weeks = 0;
Calendar addWeek = GregorianCalendar.getInstance();
addWeek.setTime(d2.getTime());
addWeek.add(Calendar.DATE, 6);
while(addWeek.before(d1) || addWeek.equals(d1)){
if(addWeek.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){
Weeks++;
}
addWeek.add(Calendar.DATE,1);
}
System.out.println(
"The number of weeks (from monday to sunday) between both dates are: "
+ Weeks);
}