输入一个日期,格式为yyyy/MM/dd,检验一下输入的日期是否和法,例如输入2018/02/31,很明显这是不合法的,因为即使2月在闰年才29天,非闰月是28天,所以2018/02/31不合法;比如输入2018/13/25,这也是不合法的,月份的有效数字是1~12;再比如输入2018/02/35,不合法,因为一个月最少28天最多有31天。
输入样例:
2018/02/31
输出样例:
不合法
输入样例:
2018/02/35
输出样例:
不合法
输入样例:
2018/02/28
输出样例:
合法
注意:输入的年份应大于公元0年,年份需4位数,月份1位数2位数都可以,日1位数2位数都可以。
我的思路:需要借助到两个类,SimpleDateFormat类和Date类。
SimpleDateFormat:SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
Date:Date 表示特定的瞬间,精确到毫秒。
- 年份 y 由整数 y
- 1900
表示。 - 月份由从 0 至 11 的整数表示;0 是一月、1 是二月等等;因此 11 是十二月。
- 日期(一月中的某天)按通常方式由整数 1 至 31 表示。
- 小时由从 0 至 23 的整数表示。因此,从午夜到 1 a.m. 的时间是 0 点,从中午到 1 p.m. 的时间是 12 点。
- 分钟按通常方式由 0 至 59 的整数表示。
- 秒由 0 至 61 的整数表示;值 60 和 61 只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的 Java 实现中。于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循 ISO C 的日期和时间约定。
Date类一个重要特点:在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。
根据这各特点,我们可以把输入的时间转换为Date类型,并且比较输入的年、月、日和Date类型中的年、月、日是否相同,如果相同则说明输入的日期适合法的,否则输入的日期是不合法的。因为从Date类中获得的年份用 y - 1900 表示,所以y
应为y+1900,即y = date.getYear()+1900;月份由从 0 至 11 的整数表示,所以m = date.getMonth()+1。
代码如下:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class 日期检测
{
public static void main(String[] args) throws ParseException
{
Scanner in = new Scanner(System.in);
String str = in.next(); //输入日期
String[] s = new String[3]; //定义一个字符串数组,长度为3
s = str.split("/"); //把日期切割,年月日放到数组中
int y = Integer.parseInt(s[0]); //年 转成int类型
int m = Integer.parseInt(s[1]); //月 转成int类型
int d = Integer.parseInt(s[2]); //日 转成int类型
//使用指定的日期格式(yyyy/MM/dd)创建SimpleDateFormat对象
SimpleDateFormat simple = new SimpleDateFormat("yyyy/MM/dd");
Date date = simple.parse(str); //将输入的日期转换为Date类型
int y2 = date.getYear()+1900; //转换成Date类型后的年
int m2 = date.getMonth()+1; //转换成Date类型后的月
int d2 = date.getDate(); //转换成Date类型后的日
if(y==y2&&m2==m&&d2==d)//如果输入的年月日和转换为Date类型的年月日相等
{
System.out.println("合法");
}
else
{
System.out.println("不合法");
}
}
}