如何解决Java LocalDate如何利用
输入列表
- 从日期开始2020-10-01
- 至今ex)2020-10-30
- 列出[星期几]例如)[星期日,星期一...]
- 列表[周]例如)[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.time
我也建议您使用java.time(现代的Java日期和时间API)进行日期工作。我的镜头是:
LocalDate fromDate = LocalDate.of(2020,Month.OCTOBER,1);
LocalDate toDate = LocalDate.of(2020,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
对象,以确保尊重所选的周计划。
如果您需要涵盖一个以上的日历月,请对月份进行迭代,并对每个月进行相同的操作。另外,请检查结果日期是否在月份内,以便忽略月份边界附近的重复项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。