问题描述
记一个日期为 yy 年 mm 月 dd 日,统计从 2000 年1月1日(含)到2000000 年 1月1日(含),有多少个日期满足年份 yy 是月份 mm 的倍数,同时也是 dd 的倍数。当年份是 4 的倍数而不是 100 的倍数或者年份是 400 的倍数时,这一年是闰年,其他的年份都不是闰年。
参考代码
import java.time.LocalDate;
public class DateCounter {
public static void main(String[] args) {
LocalDate startDate = LocalDate.of(2000, 1, 1);
LocalDate endDate = LocalDate.of(2000000, 1, 1);
long count = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
int year = date.getYear();
int month = date.getMonthValue();
int day = date.getDayOfMonth();
if (year % month == 0 && year % day == 0) {
count++;
}
}
System.out.println("Total dates: " + count);
}
}
知识拓展
LocalDate
类是 Java 8 中引入的一个日期时间 API 的一部分,用于处理没有时间的日期。它位于 java.time
包中,为日期提供了不可变且线程安全的表示。以下是关于 LocalDate
类的一些详细讲解:
1. 创建 LocalDate 实例
- 使用当前日期:
LocalDate today = LocalDate.now();
- 使用特定日期:
LocalDate date = LocalDate.of(2023, 10, 27); // 2023-10-27
- 从字符串解析:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate parsedDate = LocalDate.parse("2023-10-27", formatter);
2. 获取日期的部分
- 获取年份:
int year = date.getYear(); // 2023
- 获取月份:
int month = date.getMonthValue(); // 10
- 获取月份枚举:
Month monthEnum = date.getMonth(); // OCTOBER
- 获取日:
int day = date.getDayOfMonth(); // 27
- 获取一周的第几天(星期一为 1,星期日为 7):
int dayOfWeek = date.getDayOfWeek().getValue(); // e.g., 6 for Saturday
3. 操作 LocalDate
- 增加天数:
LocalDate newDate = date.plusDays(5); // Adds 5 days to the date
- 减少月份:
LocalDate previousMonth = date.minusMonths(1); // Subtracts 1 month from the date
- 比较两个日期:
- 使用
isBefore()
,isAfter()
,isEqual()
,isLeapYear()
等方法。
- 使用
- 计算两个日期之间的差异:
long daysBetween = CHRONO_UNITS.daysBetween(date1, date2); // daysBetween will be a long value
- 调整日期到月份的第一天或最后一天:
LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
- 格式化日期:使用
DateTimeFormatter
来格式化LocalDate
。例如,将日期格式化为字符串或将字符串解析为日期。 - 与其他日期/时间类互操作:例如,与
LocalDateTime
,ZonedDateTime
,Instant
等的转换。 - 时区无关:
LocalDate
不包含时区信息,因此它是时区无关的。如果需要时区信息,可以使用ZonedDateTime
或LocalDateTime
。 - 不可变性:
LocalDate
实例是不可变的,这意味着对其进行的任何操作都会返回一个新的实例,而不是修改原始实例。这有助于创建线程安全的代码。 - 与旧API的互操作性:虽然新的日期/时间API优于旧的
java.util.Date
和Calendar
类,但它仍然提供与这些类的互操作性,以便在必要时可以转换。例如,你可以将LocalDate
转换为java.util.Date
。但建议尽可能使用新的API,因为它解决了许多问题并提供了更多的功能。