Java LocalDate 如何利用
Java LocalDate How to utilize
输入列表
- 从日期 ex) 2020-10-01
- 迄今为止 ex) 2020-10-30
- 列出[星期几] ex) [星期日、星期一....]
- 列出[周] ex) [1,4,5]
我想知道如何获取两个日期之间的星期几。
谢谢
from date ex) 2020-10-01 to date 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
了解有关 date-time API 的更多信息
java.time
我也建议您使用 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);
}
}
}
输出:
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
对象进行两项调整,以确保选择的周计划得到尊重。
如果您需要涵盖一个以上的日历月,请遍历这些月并对每个月执行相同的操作。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。
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);
}
}
}
}
抱歉问错问题了。
非常感谢你。
我已经做到了,但是我研究了你的代码。
输入列表
- 从日期 ex) 2020-10-01
- 迄今为止 ex) 2020-10-30
- 列出[星期几] ex) [星期日、星期一....]
- 列出[周] ex) [1,4,5]
我想知道如何获取两个日期之间的星期几。 谢谢
from date ex) 2020-10-01 to date 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
了解有关 date-time API 的更多信息
java.time
我也建议您使用 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);
}
}
}
输出:
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
对象进行两项调整,以确保选择的周计划得到尊重。
如果您需要涵盖一个以上的日历月,请遍历这些月并对每个月执行相同的操作。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。
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);
}
}
}
}
抱歉问错问题了。 非常感谢你。
我已经做到了,但是我研究了你的代码。