零、前言
今天是学习 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