Java 实现一个返回“0”的方法;“每周数据”;
在我的应用程序中,我实现了几种返回与一周周期相关的数据的服务方法 因此,我有几种类似于Java 实现一个返回“0”的方法;“每周数据”;,java,Java,在我的应用程序中,我实现了几种返回与一周周期相关的数据的服务方法 因此,我有几种类似于getDataByDateInterval(Date from,Date to)的方法,但实际上我需要始终检索一周的数据:从周一到周日(或者周日到周六,如果您愿意的话) 在这种情况下,使用带有单个Date参数的方法,然后计算周日期跨度是否更正确 我想找到一种优雅而正确的方法来实现这些方法。我认为实现这一点的最佳方法是链接您的方法: getDataByDateInterval(Date from, Date to
getDataByDateInterval(Date from,Date to)
的方法,但实际上我需要始终检索一周的数据:从周一到周日(或者周日到周六,如果您愿意的话)
在这种情况下,使用带有单个Date
参数的方法,然后计算周日期跨度是否更正确
我想找到一种优雅而正确的方法来实现这些方法。我认为实现这一点的最佳方法是链接您的方法:
getDataByDateInterval(Date from, Date to) {
//...
}
getDataByWeek(Date to) {
// Calculate 'from' date (minus 7 days)
return getDataByDateInterval(from, to);
}
这种方法可以保持界面清晰,但可以防止违反DRY原则。我喜欢@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
我使用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);
}
你需要(和可怕的和)来自,来自(或在)。这两个库为几乎所有项目添加了非常有用的功能。如果你不使用它们,你就是在削弱自己。看起来是这样的,
Weeks
很有用,但它只不过是一个整数(周数)的包装而已。不确定它是否适用于这里。非常有用,谢谢。这个计算对于Joda时间来说是微不足道的:new LocalDate()。减去(Weeks.ONE)
@dimo414,而我是Joda(和另一张海报中提到的番石榴)的忠实粉丝,问题更多地涉及类/接口设计,而不是日期计算的底层实现。总的来说,我的评论不是批评,只是提供了一种可能的方法来“计算”日期(减去7天)”。@dimo414很抱歉造成混淆。我不认为这是批评。进一步解释为什么我不打算编辑我的答案以包含实现细节。同意,不需要在高级答案中包含一个可能的实现细节。除非您有意使用时间和时区(通常,您不想这样做),否则对于日期数学和其他问题,您应该更喜欢使用LocalDate
“抽象”日期操作。如果确实要处理时间和时区,则可能需要添加一个调用,以将时间设置为一天中的第一个时刻(通常00:00:00.000
,但不总是如此)。
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);
}
}