确定两个LocalDate对象之间的周数。

4

我尝试搜索答案,但没有找到。

如果网站上没有显示日期,我想决定是否以及需要切换多少周。我尝试使用天数来实现。

    LocalDate dateToSelect = parseStringDateToLocalDate(datum);
    LocalDate lastVisibleOrderDate = getLastVisibleOrderDate();
    int daysDifference = Period.between(lastVisibleOrderDate,dateToSelect).getDays();]
    int weeksToSwitch = (daysDifference / 7) + 1;

并且带有周期:

    Long weeks = ChronoUnit.WEEKS.between(lastVisibleOrderDate,dateToSelect);

然而,我无法解决如何考虑到7天的差异并仍然处于同一周的问题。
场景: 上一个可见日期 = 2017-03-12(星期日) 要选择的日期 = 2017-03-13(星期一)
差异=1。除以7=0,再加上1,所以切换到下一周。这很好!有效。
但是,如果要选择的日期是2017-03-19(星期日),则差异为7.除以7再加上1等于2。它将切换2周,但只需要切换1周。
它应该能够在周之间来回切换,因此在lastVisibleOrderDate上添加一天或在dateToSelect上减去1天会导致问题。
我可以这样做(对于正向切换),但这不是最好的选择,希望有更好的方法:
    if (0 < daysDifference && daysDifference <= 7){

    } else if (7 < daysDifference && daysDifference <=14){

    } else if (14 < daysDifference && daysDifference <=21){

    } else if (21 < daysDifference && daysDifference <=28){

    }

有任何建议吗?


2
ChronoUnit.WEEKS::between不是你想要的吗?你只解释了使用days/7方法的问题,而没有提到使用WEEKS.get方法的问题。 - undefined
确实没有起作用。它仍然会有日期差异的问题。 - undefined
2个回答

5

您想使用ChronoUnit来测量时间。

在您的问题中,if/else实际上是在衡量8天的一周。如果您减去两天,则答案基于0,最低数字为0,而不是1。因此,在您的示例中,7天实际上是一周+ 1天。

我相信这会给您带来想要的结果。

LocalDate lastVisible = LocalDate.of(2017, 3, 12);
LocalDate dateToSelect = LocalDate.of(2017, 3, 13).minusDays(1);

long weeks = ChronoUnit.WEEKS.between(lastVisible, dateToSelect);
System.out.println("number of weeks "+ weeks);

dateToSelect = LocalDate.of(2017, 3, 19).minusDays(1);
weeks = ChronoUnit.WEEKS.between(lastVisible, dateToSelect);
System.out.println("number of weeks "+ weeks);

dateToSelect = LocalDate.of(2017, 3, 20).minusDays(1);
weeks = ChronoUnit.WEEKS.between(lastVisible, dateToSelect);
System.out.println("number of weeks "+ weeks);

-- 输出:

number of weeks 0
number of weeks 0
number of weeks 1

但是这是为了获得实际的周数。
LocalDate lastVisible = LocalDate.of(2017, 3, 12);
LocalDate dateToSelect = LocalDate.of(2017, 3, 13);

long weeks = ChronoUnit.WEEKS.between(lastVisible, dateToSelect);
System.out.println("number of weeks "+ weeks);

dateToSelect = LocalDate.of(2017, 3, 19);
weeks = ChronoUnit.WEEKS.between(lastVisible, dateToSelect);
System.out.println("number of weeks "+ weeks);

// to get number of weeks regardless of going forward or backwards in time
dateToSelect = LocalDate.of(2017, 3, 20);
weeks = Math.abs(ChronoUnit.WEEKS.between(dateToSelect, lastVisible));
System.out.println("number of weeks "+ weeks);

-- 输出:

number of weeks 0
number of weeks 1
number of weeks 1

谢谢。这确实不难,你的解决方案适用于正差异。 为了考虑负差异,可以使用类似以下的代码: if (daysDifference>0){ int switchWeeks = ((daysDifference-1)/7)+1); } else{ int switchWeeksBack = daysDifference/7; } - undefined
你只需要对数值使用abs()函数来回溯时间。我添加了一个示例来解释。 - undefined

0
你可以使用double来避免这个问题。
double daysDifferenceDbl = daysDifference;
double weeksToSwitchDbl = (daysDifferenceDbl / 7) + 1;        
int weeksToSwitch = (int) weeksToSwitchDbl;

我不认为那样会起作用。DaysDifference始终是一个整数。 将weeksToSwitch声明为double并没有什么区别,因为你仍然有7/7=1.00。 - undefined
是的,但是1.0/7.0 = 0.14,与1/7=0(问题中的情况)不同。试一下吧。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接