在Joda Time中,有一种简单的方法可以达到以人为中心的风格时期吗?
例如,如果我想要过去4天,我的意思是,给我一段时间(或间隔可能更合适)3整天和当前正在进行的当前时间。所以我希望,间隔为1天,1天,1天,n个ms直到当前时间。
或者在过去的5周内,给我整整4个星期和当前正在进行的当前时间。
我花了一些时间来处理这个问题,困难的部分是尝试将一段时间“正常化”到人类对时期结束的定义。所以对于今天的日期,你需要标准化到一天的开始(总是午夜),然后找到它和现在之间的间隔。对于疯狂棘手的月份,你需要规范化到月初并转到现在...等等。为了使这更加困难我试图避免用句点特定的规范化逻辑编写一个巨大的case语句我正在努力寻找一种通用的方法。
这是我当前的代码(在Groovy中)
static List generatePreviousIntervals(BaseSingleFieldPeriod period,
int count,
DateTime end = DateTime.now()) {
if (count < 1) {
return []
}
def intervals = []
Interval last
count.times {
def finish = last?.start ?: end
def next = new Interval(period, finish)
intervals.add(next)
last = next
}
// reverse so intervals are in normal progression order
intervals.reverse()
}
Joda Time可以轻松做些什么吗?或者我必须在特定的时间间隔内有很多逻辑?
答案 0 :(得分:2)
这就是我最终要做的事情,我不够聪明以避免一个案例陈述,但幸运的是我使用了少量的句号类型,所以它没有我想象的那么大,
/**
* Reset Joda DateTime by normalize it back to the beginning of the period
*/
static DateTime resetDate(BaseSingleFieldPeriod period,
DateTime date) {
LocalDate out = new LocalDate(date)
switch (period) {
case Years.ONE:
out = out.withMonthOfYear(1).withDayOfMonth(1)
break;
case Months.ONE:
out = out.withDayOfMonth(1)
break;
case Weeks.ONE:
// adjust day of week because Joda uses ISO standard Monday
// as start of the week
out = out.withDayOfWeek(1).minusDays(1)
break;
case Days.ONE:
// nothing to for days as we have already removed time by
// converting to local date
break;
default:
throw new UnsupportedOperationException("Unsupported period $period")
}
// convert to date minute to avoid giving specific time
out.toDateMidnight().toDateTime()
}
如果有人有更优雅的解决方案,请告诉我。
答案 1 :(得分:0)
听起来你需要一个间隔: http://joda-time.sourceforge.net/apidocs/org/joda/time/Interval.html
并使用minusdays方法。 (是的,很简单,与香草java日期/日历相比非常简单)
获取时间:
int hour = dt.getHourOfDay();
int min = dt.getMinuteOfHour();
int sec = dt.getSecondOfMinute();