实现返回“周数据”的方法

时间:2014-07-29 13:04:41

标签: java

在我的应用程序中,我正在实现几种返回与一周时间相关的数据的服务方法。

所以我有几种类似于getDataByDateInterval(Date from, Date to)的方法,但实际上我需要总是检索一周的数据:从星期一到星期日(或者从星期日到星期六,如果你愿意的话)。

在这种情况下,使用单个Date参数的方法然后计算周日期跨度是否更正确?

我想找到一种优雅而正确的方法来实现这些方法。

3 个答案:

答案 0 :(得分:4)

我认为实现这一目标的最佳方法是将方法链接起来:

getDataByDateInterval(Date from, Date to) {
    //...
}

getDataByWeek(Date to) {
    // Calculate 'from' date (minus 7 days)
    return getDataByDateInterval(from, to);
}

这种方法可以保持您的界面清晰,但可以防止您违反DRY原则。

答案 1 :(得分:2)

我使用Guava的Range课程处理日期范围查询取得了巨大成功。有一段时间我尝试创建像getDataByDateInterval(Date from, Date to)这样的方法,但这些方法很麻烦,特别是要跟踪fromto在任何特定情况下是包含还是排他。

我在项目中使用了两个非常重要的界面,DatedDatedLookup

public interface Dated {
    public LocalDate getDate();
}

public interface DatedLookup<T extends Dated> {
    public List<T> queryRange(Range<LocalDate> range);
}

Range还允许您查询所有数据,或在一侧查询未绑定的数据(例如(-∞..2000-1-1)将查询2000之前的所有内容)。这引入了它自身的一些复杂性(你必须在尝试获取它们之前检查范围是否有端点),但我认为这不仅仅是一种负担。

作为实现细节,您还可以了解所有数据的边界,从而绑定用户发送的输入,例如:

public class MyClass<T> imlements DatedLookup<T> {
  // We know there's no data outside this range
  private static final Range<LocalDate> MAX_RANGE = 
      Range.closed(new LocalDate(2010,1,1), new LocalDate());

  @Override
  public List<T> queryRange(Range<LocalDate> range) {
    // range could be Range.all(), meaning it has no bounds
    range = MAX_RANGE.intersection(range);
    // now we guarenteee range has bounds, and can safely call
    LocalDate start = range.lowerEndpoint();
    ....
  }

  // We can also define useful wrappers, like
  public List<T> queryOneWeekBack(LocalDate lastDay) {
    return queryRange(Range.openClosed(lastDate.minus(Weeks.ONE), lastDay);
  }
}

您需要来自RangeRangeSet(以及真棒RangeMapGuava)以及来自LocalDateJoda-Time(或LocalDate中的java.time package中的Java 8。这两个库为几乎任何项目添加了非常有用的功能。如果你没有使用它们,你就会瘫痪自己。

答案 2 :(得分:0)

我喜欢@JamesB方法,但实际的日期计算可以使用Joda

完成
import org.joda.time.DateTime;
public class Test {

    public static void main(String[] args) {

        DateTime today = new DateTime();
        DateTime nextWeek = today.plusWeeks(1);
        DateTime lastWeek = today.minusWeeks(1);
        System.out.println("Last Week: " + lastWeek.toString("MM/dd/yyyy"));
        System.out.println("Today: " + today.toString("MM/dd/yyyy"));
        System.out.println("Next Week: " + nextWeek.toString("MM/dd/yyyy"));

    }
}

哪个收益率:

Last Week: 07/22/2014
Today: 07/29/2014
Next Week: 08/05/2014