在两个日期之间获得完整的“星期一至星期日”星期
让我们来看看你能否帮助我。我想在两个日期(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周”,所以程序不工作。怎么了?我没有遇到这个错误,也没有能力为这个问题找到一个可行的解决方案。
谢谢!
在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采取一个简单的日期,时间或偏移量的时间。它们必须是相同的类型。时间可以用加号和减号操纵。
在查看ChronoUnit时,理解计算是相对于绝对项的开始日期很重要。计算返回一个整数,表示两个时间之间的完整单位数。例如,时间为11:30和13:29之间的小时数将仅为1小时,因为这是两小时的一分钟时间 – TechTrip 2014-09-19 10:11:29
你的算法错了;您的while
循环需要比较您正在修改的相同日历对象,但不这样做,因此您要么有无限循环,要么立即退出,返回值为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);
}
一旦我意识到这是一项家庭作业问题,我几乎删除了我的答案。我要离开它,但是我也将给出答案,我几乎将它替换为:当你用调试器遍历它时,问题是**非常显着**。因此,这应该是您作为Java学生的第一课:学习如何在一行中设置断点,然后使用调试器运行以停止该行,逐行执行您的方法,检查变量等。调试器将会为您节省**小时**的猜测,了解您的问题出了什么问题;它应该始终是您遇到任何问题的第一步。 – Tim 2014-09-19 00:31:29
在我看来,有几个你做小错误:
1)你的输出为0星期,因为在你的代码的其他地方,你必须调用此方法与你的第一个参数d1
,早于第二个参数,而在方法体中,则认为d2
早于d1
。通过使用有意义的参数名称很容易避免这种错误。在这种情况下适当的参数名称是例如start
和end
。
2)如果使用其中d2
早于d1
的参数执行此方法,则您的方法将陷入无限循环。它在我看来加入date2
不会更改addWeek
中的日期。
3)您的方法计算从周二到周一而不是周一到周日的周数。要解决此问题,请在addWeek
中添加7天而不是六个,或者更改while循环以仅在addWeek
在d1
之前检查并在周日增加weeks
。
把所有这些组合起来,我相信这会给你你在找什么:
public static void getFullWeeks(Calendar start, Calendar end)
{
System.out.println("The number of weeks (from monday to sunday) between both dates are: " + getNrWeeksBetween(start, end));
}
private static int getNrWeeksBetween(Calendar start, Calendar end)
{
int weeks = 0;
Calendar counter = new GregorianCalendar();
counter.setTime(start.getTime());
counter.add(Calendar.DATE, 6);
while(counter.before(end))
{
if(counter.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) weeks++;
counter.add(Calendar.DATE, 1);
}
return weeks;
}
我们需要知道什么是suma7。 – 2014-09-18 22:51:18
使用[joda](http://www.joda.org/joda-time/)! – hd1 2014-09-18 22:52:52
@ Jean-FrançoisSavard对不起,代码是西班牙文,我把它翻译成英文,忘记了这一点。现在已经修复了。 – Markomso 2014-09-18 23:05:16