分享

【第13题】输入某年某月某日,判断这一天是这一年的第几天?

 小虚竹 2022-04-03

文章目录

零、前言

​ 今天是学习 JAVA语言 打卡的第13天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

题目:输入某年某月某日,判断这一天是这一年的第几天?

二、解题思路

以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情况,

闰年且输入月份大于 3 时需考虑多加一天。

三、代码详解

public class Basics13 {
    public static void main(String[] args) {

        int y, m, d, sum = 0, february;
        Scanner input = new Scanner(System.in);

        System.out.print("请输入年份:");
        y = input.nextInt();
        System.out.print("请输入月份:");
        m = input.nextInt();
        System.out.print("请输入日数:");
        d = input.nextInt();

        //判断是否为闰年
        if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){
            february = 29;     //闰年则2月为29
        }else{
            february = 28;     //非闰年则28天
        }
            


        switch (m) {      //判断月份,如5月:则前四月相加再加上日数
            case 1:
                sum = d;
                break;
            case 2:
                sum = 31 + d;
                break;
            case 3:
                sum = 31 + february + d;
                break;
            case 4:
                sum = 31 * 2 + february + d;
                break;
            case 5:
                sum = 31 * 2 + 30 + february + d;
                break;
            case 6:
                sum = 31 * 3 + 30 + february + d;
                break;
            case 7:
                sum = 31 * 3 + 30 * 2 + february + d;
                break;
            case 8:
                sum = 31 * 4 + 30 * 2 + february + d;
                break;
            case 9:
                sum = 31 * 5 + 30 * 2 + february + d;
                break;
            case 10:
                sum = 31 * 5 + 30 * 3 + february + d;
                break;
            case 11:
                sum = 31 * 6 + 30 * 3 + february + d;
                break;
            case 12:
                sum = 31 * 6 + 30 * 4 + february + d;
                break;
        }

        System.out.println(y+"年"+m+"月"+d+"日"+"为这一年的第"+sum+"天");
    }
}

如图

解法二

创建maven项目,引入hutool工具包

        <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.6.5</version>
</dependency>

public class HutoolDateDemo {
    public static void main(String[] args) {
        int year, month, day;
        Scanner input = new Scanner(System.in);

        System.out.print("请输入年份:");
        year = input.nextInt();
        System.out.print("请输入月份:");
        month = input.nextInt();
        System.out.print("请输入日数:");
        day = input.nextInt();
        LocalDate localDate = LocalDate.of(year,month,day);
        ZonedDateTime dateTime = localDate.atStartOfDay(ZoneId.of("Asia/Shanghai"));
        Date date1 = Date.from(dateTime.toInstant());
        System.out.println(year+"年"+month+"月"+day+"日"+"为这一年的第"+DateUtil.dayOfYear(date1)+"天");
    }
}

如图

源码分析

1、用户和控制台可交互,可使用此方法

Scanner input = new Scanner(System.in);

2、使用JDK 8的新时间API类 LocalDate 。获取输入的时间转化为日期。

3、把 LocalDate 转化为 Date

4、使用Hutool的封装方法,获取指定日期是这个日期所在年的第几天

DateUtil.dayOfYear(date1)

/**
 * 获得指定日期是这个日期所在年的第几天
 *
 * @param date 日期
 * @return 天
 * @since 5.3.6
 */
public static int dayOfYear(Date date) {
   return DateTime.of(date).dayOfYear();
}

源码的**DateTime.of(date).dayOfYear()**可拆解成两部分

  • DateTime.of(date)
  • DateTime.dayOfYear()

DateTime.of(date):第一部分,看代码很好理解,就是类型的转化

/**
 * 转换JDK date为 DateTime
 *
 * @param date JDK Date
 * @return DateTime
 */
public static DateTime of(Date date) {
if (date instanceof DateTime) {
return (DateTime) date;
}
return new DateTime(date);
}

DateTime.dayOfYear():第二部分,调用getField方法

/**
 * 获得指定日期是这个日期所在年份的第几天,从1开始
 *
 * @return 天,1表示第一天
 * @since 5.3.6
 */
public int dayOfYear() {
   return getField(DateField.DAY_OF_YEAR);
}
/**
 * 获得日期的某个部分<br>
 * 例如获得年的部分,则使用 getField(DatePart.YEAR)
 *
 * @param field 表示日期的哪个部分的枚举 {@link DateField}
 * @return 某个部分的值
 */
public int getField(DateField field) {
return getField(field.getValue());
}

/**
 * 获得日期的某个部分<br>
 * 例如获得年的部分,则使用 getField(Calendar.YEAR)
 *
 * @param field 表示日期的哪个部分的int值 {@link Calendar}
 * @return 某个部分的值
 */
public int getField(int field) {
return toCalendar().get(field);
}

从代码跟下来,可以发现会走到toCalendar().get(field)

toCalendar() 还可以获取年,月,日,时,分,秒。

四、推荐专栏

《JAVA从零到壹》

《JAVA从零到壹》第三讲:条件循环

《JAVA从零到壹》第八讲:系统常用类

3hutool实战:DateUtil-获取日期的各种内容

3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基13

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多