英文:
Oracle next_day function equivalent in JAVA
问题
/**
* @param date
* @param weekDay
* @return Gives the date for the next weekday specified in the parameter.
*/
public Date getNextDay(Date value, String weekday) {
Calendar date1 = Calendar.getInstance();
date1.setTime(value);
String[] weekdays = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
int targetDayOfWeek = -1;
for (int i = 0; i < weekdays.length; i++) {
if (weekday.equalsIgnoreCase(weekdays[i])) {
targetDayOfWeek = i;
break;
}
}
if (targetDayOfWeek == -1) {
throw new IllegalArgumentException("Invalid weekday provided.");
}
int currentDayOfWeek = date1.get(Calendar.DAY_OF_WEEK);
int daysUntilTarget = (targetDayOfWeek - currentDayOfWeek + 7) % 7;
date1.add(Calendar.DATE, daysUntilTarget);
return date1.getTime();
}
This revised code uses an array of weekdays and calculates the number of days needed to reach the next target weekday in a more concise manner. It eliminates the need for multiple if-else conditions and simplifies the logic.
英文:
I wanted to make a method which works similar to as oracle's next_day()
function, below is my code which accepts date n weekday in MONDAY,TUESDAY etc. and returns a date which falls on the next given day from the input date.
/**
* @param date
* @param weekDay
* @return Gives the date for next weekday specified in the parameter.
*/
public Date getNextDay(Date value, String weekday) {
Calendar date1 = Calendar.getInstance();
date1.setTime(value);
if (weekday.equalsIgnoreCase("MONDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
date1.add(Calendar.DATE, 1);
}
} else if (weekday.equalsIgnoreCase("TUESDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.TUESDAY) {
date1.add(Calendar.DATE, 1);
}
} else if (weekday.equalsIgnoreCase("WEDNESDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.WEDNESDAY) {
date1.add(Calendar.DATE, 1);
}
} else if (weekday.equalsIgnoreCase("THURSDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.THURSDAY) {
date1.add(Calendar.DATE, 1);
}
} else if (weekday.equalsIgnoreCase("FRIDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY) {
date1.add(Calendar.DATE, 1);
}
} else if (weekday.equalsIgnoreCase("SATURDAY")) {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
date1.add(Calendar.DATE, 1);
}
} else {
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
date1.add(Calendar.DATE, 1);
}
}
return date1.getTime();
}
Please suggest a better way of doing this.
答案1
得分: 4
我建议您使用现代的 java.time
日期时间 API 进行操作。从 教程:日期时间 中可以了解更多有关现代日期时间 API 的信息。java.util
日期时间 API 和 SimpleDateFormat
已过时且容易出错。如果您未使用 Java 8,您仍可以通过 ThreeTenABP 库来使用 Java 8 的日期时间 API。
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
// Tests
// Next occurrence
System.out.println(getNextDay(LocalDate.now(), "Monday"));
System.out.println(getNextDay(LocalDate.now(), "Wednesday"));
// Same (if date falls on the given day) or next occurrence
System.out.println(getSameOrNextDay(LocalDate.now(), "Monday"));
System.out.println(getSameOrNextDay(LocalDate.now(), "Wednesday"));
}
static LocalDate getNextDay(LocalDate value, String weekday) {
return value.with(TemporalAdjusters.next(DayOfWeek.valueOf(weekday.toUpperCase())));
}
static LocalDate getSameOrNextDay(LocalDate value, String weekday) {
return value.with(TemporalAdjusters.nextOrSame(DayOfWeek.valueOf(weekday.toUpperCase())));
}
}
输出:
2020-09-28
2020-09-30
2020-09-28
2020-09-23
英文:
I recommend you do it using the modern java.time
date-time API. Learn more about the modern date-time API from Trail: Date Time. The java.util
date-time API and SimpleDateFormat
are outdated and error-prone. In case you are not using Java-8, you can still use Java-8 date-time API through ThreeTenABP library.
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
// Tests
// Next occurrence
System.out.println(getNextDay(LocalDate.now(), "Monday"));
System.out.println(getNextDay(LocalDate.now(), "Wednesday"));
// Same (if date falls on the given day) or next occurrence
System.out.println(getSameOrNextDay(LocalDate.now(), "Monday"));
System.out.println(getSameOrNextDay(LocalDate.now(), "Wednesday"));
}
static LocalDate getNextDay(LocalDate value, String weekday) {
return value.with(TemporalAdjusters.next(DayOfWeek.valueOf(weekday.toUpperCase())));
}
static LocalDate getSameOrNextDay(LocalDate value, String weekday) {
return value.with(TemporalAdjusters.nextOrSame(DayOfWeek.valueOf(weekday.toUpperCase())));
}
}
Output:
2020-09-28
2020-09-30
2020-09-28
2020-09-23
答案2
得分: 2
如果您对明天感兴趣,我建议使用java.time.LocalDate
而不是java.util.Date
。
以下代码接受一个LocalDate
,以及一个String
(必须是大写字母的整个星期几),并返回代表最近未来日期的LocalDate
,该日期具有给定的星期几:
public static LocalDate nextDay(LocalDate sourceDay, String weekday) {
// 将星期几解析为枚举值
DayOfWeek dayOfWeek = DayOfWeek.valueOf(weekday);
// 检查日期是否与给定的LocalDate的星期几相同
if (sourceDay.getDayOfWeek().equals(dayOfWeek)) {
// 并返回一周后的LocalDate
return sourceDay.plusWeeks(1);
} else {
// 否则将一天添加到给定日期
LocalDate nextDayOfWeek = sourceDay.plusDays(1);
// 并重复此步骤,直到达到给定日期的星期几
while (nextDayOfWeek.getDayOfWeek() != dayOfWeek) {
nextDayOfWeek = nextDayOfWeek.plusDays(1);
}
// 然后返回未来日期
return nextDayOfWeek;
}
}
您可以在main
方法中这样使用它:
public static void main(String[] args) {
System.out.println(nextDay(LocalDate.now(), "FRIDAY")
.format(DateTimeFormatter.ofPattern("uuuu-MM-dd '('EEEE')'",
Locale.ENGLISH)));
}
输出(今天 ⇒ 2020-09-23
):
2020-09-25 (Friday)
英文:
If you are interested in the next day I'll suggest using a java.time.LocalDate
instead of a java.util.Date
.
The following code accepts such a LocalDate
along with a String
(that needs to be a full day of week in upper case letters) and returns the LocalDate
representing the nearest future date which has the given day of week:
public static LocalDate nextDay(LocalDate sourceDay, String weekday) {
// parse the day of week to an enum value
DayOfWeek dayOfWeek = DayOfWeek.valueOf(weekday);
// check if the day is the same as the one of the given LocalDate
if (sourceDay.getDayOfWeek().equals(dayOfWeek)) {
// and return the LocalDate that's a week later
return sourceDay.plusWeeks(1);
} else {
// otherwise add a day to the given date
LocalDate nextDayOfWeek = sourceDay.plusDays(1);
// and do that until the day of week of the given date is reached
while (nextDayOfWeek.getDayOfWeek() != dayOfWeek) {
nextDayOfWeek = nextDayOfWeek.plusDays(1);
}
// then return the future date
return nextDayOfWeek;
}
}
You can use it in a main
like this:
public static void main(String[] args) {
System.out.println(nextDay(LocalDate.now(), "FRIDAY")
.format(DateTimeFormatter.ofPattern("uuuu-MM-dd '('EEEE')'",
Locale.ENGLISH)));
}
Output (today ⇒ 2020-09-23
):
2020-09-25 (Friday)
答案3
得分: 1
使用“新的” java.time.DayOfWeek
和 java.time.LocalDate
类:
public LocalDate getNextDay(
final LocalDate value,
final DayOfWeek day
)
{
int currentDay = value.getDayOfWeek().getValue();
int expectedDay = day.getValue();
if (currentDay >= expectedDay)
{
expectedDay += 7;
}
return value.plusDays(expectedDay - currentDay);
}
英文:
Use the "new" java.time.DayOfWeek
and java.time.LocalDate
classes:
public LocalDate getNextDay(
final LocalDate value,
final DayOfWeek day
)
{
int currentDay = value.getDayOfWeek().getValue();
int expectedDay = day.getValue();
if ( currentDay >= expectedDay )
{
expectedDay += 7;
}
return value.plusDays( expectedDay - currentDay );
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论