第十四届蓝桥杯_Java_A组_特殊日期

问题描述

记一个日期为 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 不包含时区信息,因此它是时区无关的。如果需要时区信息,可以使用 ZonedDateTimeLocalDateTime
  • 不可变性LocalDate 实例是不可变的,这意味着对其进行的任何操作都会返回一个新的实例,而不是修改原始实例。这有助于创建线程安全的代码。
  • 与旧API的互操作性:虽然新的日期/时间API优于旧的 java.util.DateCalendar 类,但它仍然提供与这些类的互操作性,以便在必要时可以转换。例如,你可以将 LocalDate 转换为 java.util.Date。但建议尽可能使用新的API,因为它解决了许多问题并提供了更多的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值