输入列表
- 从日期前)2020-10-01
- 迄今为止 ex) 2020-10-30
- 列出 [星期几] 例如)[太阳,星期一....]
- 列表 [周] ex) [1,4,5]
我想知道如何在这两个日期之间获得一周中的特定日期。感谢。
输入列表
我想知道如何在这两个日期之间获得一周中的特定日期。感谢。
从日期 ex) 2020-10-01 到日期 ex) 2020-10-30
您的输入字符串已经是日期的 ISO8601 格式,因此可以在不DateTimeFormatter
显式提供的情况下对其进行解析。为了以自定义格式(例如yyyy-MM-dd
)获取输出字符串,您需要使用DateTimeFormatter
.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String inputStrDate = "2020-10-01";
LocalDate date = LocalDate.parse(inputStrDate);
String outputStrDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(outputStrDate);
}
}
输出:
2020-10-01
但是,如果您的输入是其他格式,则需要使用DateTimeFormatter
它来将其解析为日期对象。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Formatter for input string
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
String inputStrDate = "10-01-2020";
LocalDate date = LocalDate.parse(inputStrDate, inputFormat);
// Formatter for output string
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String outputStrDate = date.format(outputFormat);
System.out.println(outputStrDate);
}
}
输出:
2020-10-01
从Trail: Date Time了解有关日期时间 API 的更多信息。
for(LocalDate d = fromDate; !d.isAfter(toDate); d = d.plusDays(1)) { // 일정 시작 ~ 끝 loop
for (Integer wf : weekOfMonth) {
for (Integer df : dayOfWeek) {
offDay = d.with(fieldWeek, wf)
.with(fieldDay, df);
if (d.getMonth() == offDay.getMonth() && !offDays.contains(offDay)) {
offDays.add(offDay);
}
}
}
}
很抱歉问错了问题。非常感谢你。
我已经做到了,但我研究了你的代码。
我也建议您使用现代 Java 日期和时间 API java.time 进行日期工作。我的镜头是:
LocalDate fromDate = LocalDate.of(2020, Month.OCTOBER, 1);
LocalDate toDate = LocalDate.of(2020, Month.OCTOBER, 30);
List<DayOfWeek> daysOfWeek = List.of(DayOfWeek.SUNDAY, DayOfWeek.MONDAY);
List<Integer> weeks = List.of(1, 4, 5);
if (! YearMonth.from(fromDate).equals(YearMonth.from(toDate))) {
throw new IllegalStateException("Covering more than one month is not yet supported");
}
WeekFields wf = WeekFields.SUNDAY_START;
for (int week : weeks) {
for (DayOfWeek dow : daysOfWeek) {
LocalDate date = fromDate.with(wf.weekOfMonth(), week)
.with(wf.dayOfWeek(), dow.get(wf.dayOfWeek()));
// Is date inside interval?
if (! (date.isBefore(fromDate) || date.isAfter(toDate))) {
System.out.println(date);
}
}
}
输出:
2020-10-18 2020-10-19 2020-10-25 2020-10-26
打印的日期是 10 月第 4 周和第 5 周的星期日和星期一,以美国方式定义星期从星期日开始(因为您在示例列表中首先提到星期日),第 1 周是 10 月 1 日的那一周。星期日和星期一没有打印第 1 周的数据,因为它们在 10 月 1 日之前,即 9 月。
考虑您需要哪个周计划。您可以使用例如WeekFields.ISO
或WeekFields.of(Locale.getDefault())
。
我首先找到星期,然后是星期几,因为对我来说这是自然的方式。我需要使用该WeekFields
对象进行两次调整,以确保尊重所选的周计划。
如果您需要覆盖多个日历月,请迭代几个月并为每个月做同样的事情。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。