我有一个类似这样的枚举
enum Period{DAY, WEEK, MONTH, YEAR}
我需要的是一个函数,它将给定周期的指定次数添加到 today
设置月份的日期,使其等于开始日期(如果结果有效)。
或者像这样更容易理解:假设你每个月31号拿到薪水(如果适用的话)。函数返回下一个有效日期(从今天开始),即您将收到下一份工资的日期。函数可以区分是否每天、每周、每月、每年以及在指定间隔内多久获取一次。它还处理无效日期
我们来看一个例子:
public static Date getNextDate(Date startDate, Period period, int times){
/*
Examples:
getNextDate(31.08.2020, MONTH, 1) -> 30.09.2020
getNextDate(31.08.2020, MONTH, 2) -> 31.10.2020
getNextDate(30.05.2020, MONTH, 2) -> 30.09.2020
getNextDate(30.06.2020, MONTH, 2) -> 30.10.2020 (This is the next valid date after today)
Years are pretty simple i guess (Okay, there is at least one edge case):
getNextDate(28.02.2020, YEAR, 1) -> 28.02.2021
getNextDate(29.02.2020, YEAR, 1) -> 28.02.2021 <- Edge case, as 2020 is a gap year
getNextDate(29.02.2020, YEAR, 4) -> 29.02.2024 <- gap year to gap year
For weeks and days there are no edge cases, are there?
getNextDate(29.02.2020, DAY, 1) -> 03.09.2020
getNextDate(29.02.2020, DAY, 3) -> 05.09.2020
getNextDate(29.02.2020, WEEK, 2) -> 12.09.2020 (Same as DAY,14)
Important: If today is already a payment day, this already is the solution
getNextDate(03.09.2020, MONTH, 1) -> 03.09.2020 (No change here, the date matches today)
* /
}
实际上,我更喜欢使用现代的localdateapi(只是输入目前是一个旧的date对象,但稍后会更改)
我希望我没有忘记任何边缘案件。
更新我所做的
//This is a method of the enum mentioned
public Date getNextDate(Date baseDate, int specific) {
Date result = null;
switch (this) {
case DAY:
result = DateTimeUtils.addDays(baseDate, specific);
break;
case WEEK:
result = DateTimeUtils.addWeeks(baseDate, specific);
break;
case MONTH:
result = DateTimeUtils.addMonths(baseDate, specific);
break;
case YEAR:
result = DateTimeUtils.addYears(baseDate, specific);
break;
}
return result;
}
public Date getNextDateAfterToday(Date baseDate) {
today = new Date();
while(!baseDate.equals(today ) && !baseDate.after(today)){
baseDate= getNextDate(baseDate,1);
}
return startHere;
}
我的 getNextDate()
方法有效。这个 getNextDateAfterToday()
也可以,但不会返回边缘情况的有效日期。例子 31.06.2020, MONTH,1
在每个月的30号会立即停止,即使这个月有31天也不会向后跳。对于2020年9月30日,这是正确的。但到了2020年10月31日就不会了
4条答案
按热度按时间wnavrhmk1#
…(虽然对于我真正想要达到的目标来说,这似乎是一种,一种,一种复杂的方式)…
你自己的解决方案还不错。我就是不能让挑战停下来,所以我来了。我觉得简单一点。
我将全神贯注于java.time,这是一个现代的java日期和时间api。我也跳过了你的课
Period
自预定义ChronoUnit
enum实现了这个目的。只是它还包括小时、分钟和其他在这里没有意义的单位,所以我们需要拒绝这些单位。这个
Date
课程设计很差,而且已经过时很久了。如果你能避免它(如果你不能避免它,我会给你最后的解决办法)。为了演示我使用的这个小实用方法:
现在让我们看看:
刚才运行时,输出是:
我应该说,这与你在这个问题上的例子是一致的。
如果你不能避免有一个老式的
Date
对象和自己的示例Period
枚举和/或你需要一个老式的Date
返回,您可以将我的方法 Package 成一个执行必要转换的方法。首先,我将扩展枚举以了解其对应的ChronoUnit
常数:现在 Package 器方法可能是这样的;
cmssoen22#
你可以用这个班
Calendar
要这样解决问题:句点是calendar类中定义的int,可以这样调用函数:
如果你真的需要
enum
,你能做到的!jucafojl3#
最好不要使用十年前的DateAPI,因为它编写得很糟糕,而且通常不安全,使用起来很痛苦。使用
java.time
可能对你有利。将方法签名更改为以下内容,就是您所要做的:然后可以这样称呼:
或者干脆在第一时间删除助手函数并直接使用它:
nwlls2ji4#
我终于想出了一个办法(尽管对于我真正想达到的目标来说,似乎是一个办法,一个办法,一个办法)。我改变了主意
getNextDateAfterToday
为了这个我没有将另一个方法更改为使用localdate,但将来会这样做。这适用于我上面发布的所有测试用例。虽然我希望我没有错过重要的