检验日期合法性

输入一个日期,格式为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("不合法");
		}
	}
}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值