2014-09-18 109 views
0

让我们来看看你能否帮助我。我想在两个日期(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

我们需要知道什么是suma7。 – 2014-09-18 22:51:18

+0

使用[joda](http://www.joda.org/joda-time/)! – hd1 2014-09-18 22:52:52

+0

@ Jean-FrançoisSavard对不起,代码是西班牙文,我把它翻译成英文,忘记了这一点。现在已经修复了。 – Markomso 2014-09-18 23:05:16

回答

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采取一个简单的日期,时间或偏移量的时间。它们必须是相同的类型。时间可以用加号和减号操纵。

+0

在查看ChronoUnit时,理解计算是相对于绝对项的开始日期很重要。计算返回一个整数,表示两个时间之间的完整单位数。例如,时间为11:30和13:29之间的小时数将仅为1小时,因为这是两小时的一分钟时间 – TechTrip 2014-09-19 10:11:29

0

你的算法错了;您的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); 
} 
+0

一旦我意识到这是一项家庭作业问题,我几乎删除了我的答案。我要离开它,但是我也将给出答案,我几乎将它替换为:当你用调试器遍历它时,问题是**非常显着**。因此,这应该是您作为Java学生的第一课:学习如何在一行中设置断点,然后使用调试器运行以停止该行,逐行执行您的方法,检查变量等。调试器将会为您节省**小时**的猜测,了解您的问题出了什么问题;它应该始终是您遇到任何问题的第一步。 – Tim 2014-09-19 00:31:29

0

在我看来,有几个你做小错误:

1)你的输出为0星期,因为在你的代码的其他地方,你必须调用此方法与你的第一个参数d1,早于第二个参数,而在方法体中,则认为d2早于d1。通过使用有意义的参数名称很容易避免这种错误。在这种情况下适当的参数名称是例如startend

2)如果使用其中d2早于d1的参数执行此方法,则您的方法将陷入无限循环。它在我看来加入date2不会更改addWeek中的日期。

3)您的方法计算从周二到周一而不是周一到周日的周数。要解决此问题,请在addWeek中添加7天而不是六个,或者更改while循环以仅在addWeekd1之前检查并在周日增加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; 
} 
相关问题