Java LocalDate如何利用
输入列表Java LocalDate如何利用,java,dayofweek,localdate,date-manipulation,Java,Dayofweek,Localdate,Date Manipulation,输入列表 自日期ex)2020-10-01 截至日期(ex)2020-10-30 列表[星期几]前[星期日,星期一….] 列表[周]ex)[1,4,5] 我想知道如何在这两个日期之间确定一周中的某一天。 谢谢 从日期ex)2020-10-01到日期ex)2020-10-30 您的输入字符串已经是日期的ISO8601格式,因此可以在不显式提供DateTimeFormatter的情况下对其进行解析。为了以自定义格式获取输出字符串(例如,yyyy-MM-dd),您需要使用DateTimeFormatt
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
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
2020-10-01
从java.time了解有关日期时间API的更多信息
我也建议您使用java.time(现代java日期和时间API)进行日期工作。我的目标是:
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);
}
}
}
打印的日期是10月4日和5日的星期日和星期一,以美国方式定义星期,星期从星期日开始(因为您在示例列表中首先提到了星期日),第1周是10月1日的一周。第一周的星期日和星期一不打印,因为它们在10月1日之前,即9月
考虑一下你需要哪一周的计划。例如,您可以使用WeekFields.ISO
或WeekFields.of(Locale.getDefault())
我先找到一周,然后是一周中的某一天,因为对我来说这是自然的方式。我需要使用WeekFields
对象进行两次调整,以确保所选的周计划得到遵守
如果您需要覆盖一个以上的日历月,请迭代这些月,并对每个月执行相同的操作。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项
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);
}
}
}
}
很抱歉问错了问题。
非常感谢
我已经做到了,但我已经研究了您的代码。老实说,按照堆栈溢出标准,这不是一个很好的问题。即使你不知道从哪里开始,也要从搜索开始,看看你是否可以一起尝试。如果失败了,发布一个问题,并解释你发现了什么,你尝试了什么,以及它是如何失败的,我们马上就有了一个更好的起点来帮助你进步。无论如何,不要绝望,学习如何提出一个好问题需要一点时间,只要在你提出更多问题的同时继续学习。回头见。周的列表,是月的那一周,年的那一周,还是…?这两个日期是否总是在同一个月,或者至少在同一年,或者至少相隔一年?这是否回答了你的问题?在这个问题上,你能用自己一周中的几天来代替周六和周日吗?