在我的应用程序中,我正在实现几种返回与一周时间相关的数据的服务方法。
所以我有几种类似于getDataByDateInterval(Date from, Date to)
的方法,但实际上我需要总是检索一周的数据:从星期一到星期日(或者从星期日到星期六,如果你愿意的话)。
在这种情况下,使用单个Date
参数的方法然后计算周日期跨度是否更正确?
我想找到一种优雅而正确的方法来实现这些方法。
答案 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)
这样的方法,但这些方法很麻烦,特别是要跟踪from
和to
在任何特定情况下是包含还是排他。
我在项目中使用了两个非常重要的界面,Dated
和DatedLookup
:
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);
}
}
您需要来自Range
的RangeSet
(以及真棒RangeMap
和Guava)以及来自LocalDate
的Joda-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