问题描述
如何通过一周中的某一天来确定第二天的日期?
例如,如果今天(6 月 3 日)我通过了星期一,它将给我 07 JUNE,因为下一个星期一是 07六月?
我们在:6 月 6 日星期日,如果我输入:
- 星期日,返回6 月 6 日
- 星期一,返回6 月 7 日
- 星期二,返回6 月 8 日
解决方法
java.time
使用 LocalDate#with(TemporalAdjuster)
获取所需的 LocalDate
。
演示:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMMM",Locale.ENGLISH);
System.out.println(getNextOrSameDate(DayOfWeek.SUNDAY).format(dtf));
System.out.println(getNextOrSameDate(DayOfWeek.MONDAY).format(dtf));
System.out.println(getNextOrSameDate(DayOfWeek.TUESDAY).format(dtf));
}
static LocalDate getNextOrSameDate(DayOfWeek dw) {
return LocalDate.now().with(TemporalAdjusters.nextOrSame(dw));
}
}
输出:
06 June
07 June
08 June
或者,您可以直接从函数返回工作日名称。
演示:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getNextOrSameWeekDayName(DayOfWeek.SUNDAY));
System.out.println(getNextOrSameWeekDayName(DayOfWeek.MONDAY));
System.out.println(getNextOrSameWeekDayName(DayOfWeek.TUESDAY));
}
static String getNextOrSameWeekDayName(DayOfWeek dw) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMMM",Locale.ENGLISH);
return LocalDate.now().with(TemporalAdjusters.nextOrSame(dw)).format(dtf);
}
}
或者,您可以将工作日名称作为 String
传递并返回如上所示的任何内容。但是,这很容易出错,我建议您传递 enum
而不是前面示例中所示的 String
。
演示:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getNextOrSameWeekDayName("Sunday"));
System.out.println(getNextOrSameWeekDayName("Monday"));
System.out.println(getNextOrSameWeekDayName("Tuesday"));
}
static String getNextOrSameWeekDayName(String dw) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MMMM",Locale.ENGLISH);
return LocalDate.now()
.with(TemporalAdjusters.nextOrSame(DayOfWeek.valueOf(dw.toUpperCase())))
.format(dtf);
}
}
从 modern Date-Time API 中详细了解 java.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。