⭐️前言⭐️
本篇文章是针对蓝桥杯中经常出现的日期问题进行的一个总结,在我们平常判断日期的合法性时,需要很多判断才能实现,先是判断月份和日期的合法性,再去判断是否时闰年,但我们如果利用Java中的类库就可以很快判断出日期是否合法,下边我会先介绍如何判断日期合法性,再针对几道例题进行对应练习。
🍉博客主页: 🍁【如风暖阳】🍁
🍉精品Java专栏【Javase】、【Java数据结构】
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁🍉本文由 【如风暖阳】 原创,首发于 CSDN🙉
🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
🍉博客中涉及源码及博主日常练习代码均已上传码云(gitee)
《备战蓝桥》之日期问题
📍内容导读📍
🍅判断日期合法
利用Java中的类库进行判断合法性,避免了手动判断的繁琐。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
//SimpleDateFormat类定义日期格式,构造方法内格式可以自己定义,如yyyy-MM-dd也可以
simpleDateFormat.setLenient(false);
//SimpleDateFormat类的setLenient方法是将输入的日期格式转化为标准日期
String s="20220229";
try {
Date date=simpleDateFormat.parse(s);
//SimpleDateFormat类的parse方法用来判断日期是否合法,如果不合法会报异常,所以这条语句用try catch包裹
System.out.println("yes");
} catch (ParseException e) {
System.out.println("no");
}
}
}
// no
🍅合法日期(2021模拟赛)
原题链接
题目描述
小蓝正在上小学,老师要求同学们在暑假每天记日记。可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。于是小蓝赶紧编了一些日记交给老师。
没想到,日记很快就被老师发现了问题,原来小蓝记完 8 月 31 日的日记,竟又记了 8 月 32 日和 8 月 33 日的日记。这显然是有问题的,因为根本没有 8 月 32 日和 8 月 33 日。
给定一个月份和一个日期,请问 2021 年有没有这一天。
输入描述
输入的第一行包含一个整数 mm,表示月份。
第二行包含一个整数 dd,表示日期。
其中,1≤m≤20,1≤d≤40。
输出描述
如果2021年有 mm 月 dd 日,输入 yes,否则输出 no。
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
simpleDateFormat.setLenient(false);
int a=scanner.nextInt();
int b=scanner.nextInt();
String m=String.format("%02d",a);
//将输入的月份转换为字符串类型,不足两位的用0补齐
String d=String.format("%02d",b);
//将输入的日期转换为字符串类型,不足两位的用0补齐
String s="2021"+m+d;
try {
Date date=simpleDateFormat.parse(s);
System.out.println("yes");
} catch (Exception e) {
System.out.println("no");
}
}
}
🍅回文日期(2020省赛)
这道题在上一篇文章《备战蓝桥》之数组专练中已经写出了题解,此处就是针对那道题的日期合法性判断部分做出了改变。
题解思路不懂的可以参考上一篇文章《备战蓝桥》之数组专练。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
String s3=String.valueOf(n);
//s3作用是为了在后边输出数字时跳过输入的日期,因为题目要求时下一个
n=n/10000;//取前四位日期数
int count=0;
//因为只需输出两行,count到达2时直接跳出循环
for (int i = n; i <= 9999; i++) {
String s1=String.valueOf(i);
//将前四位数字转换为字符串
StringBuilder str=new StringBuilder(s1);
//利用StringBuilder的特性将字符串倒置
str.reverse();
String s2=str.toString();
String s=s1+s2;
//s完成拼接
if(checkIs(s)&&!(s.equals(s3))) {
//!(s.equals(s3))就是为了跳过输入的日期
if(count==0) {
//回文日期只输出1次,所以输出条件为(count==0)
System.out.println(s);
count++;
}
if(checkAs(s2)) {
System.out.println(s);
count++;
}
//因为该日期可能既是回文日期,又是ABABBABA型,所以同一个日期进行二次判断
}
if(count==2)
break;
}
scan.close();
}
//判断合法性
public static boolean checkIs(String s) {
SimpleDateFormat ss=new SimpleDateFormat("yyyyMMdd");
ss.setLenient(false);
try {
Date date=ss.parse(s);
return true;
} catch (Exception e) {
return false;
}
}
//判断是否为ABABBABA
public static boolean checkAs(String s) {
if(s.charAt(0)==s.charAt(2)&&s.charAt(1)==s.charAt(3))
return true;
return false;
}
}
🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 🍅 🏀 💡 🔑
⚡️最后的话⚡️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁