【发布时间】:2014-08-21 01:21:38
【问题描述】:
我在创建一个方法来执行以下操作时遇到了一些真正的麻烦:传入一个 unix 时间戳和一个表示获取第一个日期的时间段的 int,该方法返回一个表示第一个日期的 unix 时间戳那一天。我现在使用的方法使用 Calendar 类,如下所示:
public static long firstTime(long in, int period){
if(period == DAY_OF_FIVE_YEARS){
period = Calendar.DAY_OF_YEAR;
in -= in%Vars.FIVE_YEARS;
}
cal.setTimeInMillis(in*1000L);
cal.set(period,cal.getActualMinimum(period));
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTimeInMillis()/1000L;
}
但有时我需要得到五年的第一天。例如,我将传入一个 1987 年的日期,我希望该方法返回 1985 年的第一天。上面的第一个 if 语句是我的尝试,但它不起作用,我想知道是否有更简单的方法。请注意,DAY_OF_FIVE_YEARS 是一些表示它的 int,而 Vars.FIVE_YEARS 是一个 long,表示五年中的秒数。
【问题讨论】:
-
还没试过,但是如果之后你设置
cal,然后year = cal.get(Calendar.YEAR); cal.roll(Calendar.YEAR, -(year%5));呢?我不是最伟大的Calendar专家,所以如果不尝试,我不知道这是否正确。我猜您的方法不起作用的原因是闰年,因此五年内的秒数并不是真正恒定的。 -
五是偶数年?
-
@ElliottFrisch 更像是“偶数五年”之类的——“偶数”并不总是意味着可以被 2 整除。
-
问题未指定。您可以完成您想要的,但您需要更严格地定义每个时期的含义,包括其持续时间和终点。您不能将此基于秒数,因为闰秒会妨碍您,无法“四舍五入”到特定时期的开始,纪元(值 0 的含义)以及时区的复杂性。仔细考虑所有这些问题并重新提出问题。
-
@ajb 感谢您指出滚动方法。这正是所需要的!不敢相信我错过了。此外,我将标题更改为多个而不是偶数,也许这是一种更好的放置方式。不管怎样,感谢您的帮助。