Java入门 第十二节(三) 补充: 时间类 + 正则表达式(了解即可)

1. 简单介绍 Date类

1.1 概述

  1. 时间戳,获取日期和时间。 表示日期和时间的类,在java.util.Date 下。
    • 表示当前距 1970年1月1日00:00:00时间的毫秒数。为什么会从1970年开始?。
    • 换算关系: 精确到毫秒(1000毫秒 = 1秒)。

1.2 创建对象

  1. Date类,内部设计的是一个long类型的值,并且返回的类型是long类型,需要转换。

  2. 通常将Date与long类型,毫秒值之间的转换。

    • Date 转 Long类型 getTime() ,返回long类型的毫秒值。
    • Long转Date类型通过构造方法new Date(long date); 或者 setTime(long time);
    	
    	1. 构造方法使用:
    	 		Date date = new Date(1668506720121l);//long time类型;
    	2. 创建对象使用;
    	 		Date date = new Date();
    
    

1.3 Long与Date互相转换

  1. Date类有 设计上的缺陷,但是也是值得我们去了解一下。
    • 需要记住: long 转换 Date 和 Date 转换 long。
    • System.currentTimeMillis(); 获取当前系统时间,返回long类型的毫秒值。
        public static void main(String[] args) {
    
            //1.创建对象
            Date date = new Date();
            //思考一下: 打印的是地址值么!? getClass().getName()+"@"+toH..
            // 重写了toString()
            System.out.println(date);// 获取本地时间。
    
    
            //获取当前时间节点long类型的毫秒值
            long l = System.currentTimeMillis();
            System.out.println(l);//1653312000408 毫秒,一个时间戳
    
            /* 1.主要使用的就是在Long类型毫秒值,和Date类型直接转换
             */
            //1.1 long(毫秒值)-->Date   new Date(long l);
            Date date_1 = new Date(1653312000408l);
            System.out.println(date_1); //之前的时间。
    
            //1.2  long(毫秒值)-->Date   setTime()
            date_1.setTime(1653312000408l);
            System.out.println(date_1);
    
    
            //1.3  Date-->long(毫秒值)   ,
            // 相当于返回一个long类型毫秒的时间戳!
            long time = date.getTime();
            System.out.println(time);
    
            System.out.println("----------Date缺陷----------------");
    
            //getYear();获取年份但是年份是从1900年开始。
            int year = date.getYear()+1900;
            System.out.println(year); //122+1900年
    
            //获取月份比真实月份少一个月。
            int month = date.getMonth()+1;
            System.out.println(month);
    
            //获取日期正常
            int date1 = date.getDate();
            System.out.println(date1);
    
            
        }
    

2. 时间工具类 DateFormat类

2.1 创建对象

  1. 为了能让使用者读懂Date日期输出,变得有意义, 就会使用日期格式化工具类。

    • DateFormat类是抽象类 ,无法创建对象就需要使用其,实现类 SimpleDateFormat
    • 返回的是String类型。
     new SimpleDateFormat(模式);
     日期和时间模式:
    		 推荐格式:yyyy-MM-dd HH:mm:ss
    		  	
    
    
  2. 如何使用格式化日期类。

    • 验证时间从1970年开始。
        public static void main(String[] args) {
    
    	        Date date = new Date();
    	        date.setTime(1000); //设置开始时间为1s。
    	        System.out.println(date);//Thu Jan 01 08:00:01 CST 1970
    	
    	        //时间格式化类 yyyy-MM-dd HH:mm:ss
    	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	        String time = sdf.format(date);
    	        System.out.println(time);//1970-01-01 08:00:01 为啥是 8点??
        }
    

2.2 String与Date互相转换

  1. 需要掌握的方法功能,字符串到Date之间转换(都是使用的父类DateFormat方法)。

    • 从Date类型–>String, format(Date)
    • 从String 转换到Date parse(String )
  2. 注意,时间的类型要与解析方法保持一致。

    /**
        日期:DateFormat类,对日期格式化类,public abstract class DateFormat这是一个抽象类,!?啥意思,
            不能直接创建对象,就得用它的子类去实现功能!SimpleDateFormat
    
     */
     public static void main(String[] args) {
    
            /*
                格式化日期类型,Date转String类型
             */
            Date date = new Date();
            date.setTime(1000); //设置开始时间为1s。
            System.out.println(date);//Thu Jan 01 08:00:01 CST 1970
    
            //时间格式化类 yyyy-MM-dd HH:mm:ss
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(date);//调用的父类方法
            System.out.println(time);//1970-01-01 08:00:01 为啥是 8点??
    
            System.out.println("--------------------------------------");
    
            /*
                String 类型转换为Date类型。要与解析保持一致。
             */
    
            String dateStr = "1970-01-01 08:00:01"; //是一个文本类型
            //转换为日期类型 就需要使用 DateFormat
    		//String类型要与解析保持一致。 1970-01-01 08:00:01 对应解析 yyyy-MM-dd HH:mm:ss
            SimpleDateFormat sdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                Date resault_Date = sdate.parse(dateStr);//会报异常,Exception异常。编译期间必须处理
                System.out.println(resault_Date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
        }
    
  • 输出结果:

    Thu Jan 01 08:00:01 CST 1970
    1970-01-01 08:00:01
    --------------------------------------
    Thu Jan 01 08:00:01 CST 1970
    

2.3 练习:计算在地球生活的天数!

  1. 需求:用户控制台输入自己的,出生年月日计算自己在地球存活天数。

    • 提示: 控制台接收的是String类型的出生年月日,
    • 如果计算需要使用数值类型long类型 中间需要经过 Date类型。。
    • 使用当前日期减去出生日期即可。
  2. 其实可以这么理解:

    • format(Date date)是将date类型格式化成字符串类型,给编程人员看的。
    • parse(String s) 是将字符串类转换为Date类型,给系统看的。
    public class Myself_Live {
        public static void main(String[] args) {
            System.out.println("请输入您的出生年月日格式: xxxx-xx-xx");
            String birthday = new Scanner(System.in).next();
    
            try {
                int days = Myself_Live.Date_Days(birthday);
                System.out.println(days+" 天");
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 计算天数...
         * @param birthday 出生日期
         * @return int 类型
         * @throws ParseException 解析异常
         */
        private static int Date_Days(String birthday) throws ParseException {
            //1.将String转换成Date类型。
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date parse_birthday = sdf.parse(birthday);//注意抛出异常2种方式; try 或者 向上抛出
    
            //2.获取当前的日期2种方式
            //Date date = new Date(); 返回的date类型需要转换
            long now_time = System.currentTimeMillis(); //直接返回long类型。
    
            long before_time = parse_birthday.getTime();//Date类型转为long类型  getTime()
    
            //3. 做减法处理 用现在时间减去以前时间。
            long days  = now_time-before_time;
            int resault = (int) (days/1000/60/60/24); //天数
            return resault;
        }
    }
    

3. Calendar类 (简单介绍)

  1. public abstract class Calendar日历类,抽象的,不能直接创建对象。
    • 作用: 可以单独获取日历上得某段属性。

3.1 创建对象

  1. 虽然是抽象类,但是可以通过调用静态方法来创建对象。
    • 底层也是调用子类,多态的形式。
    • 发现输出结果是一样的。
	    Calendar instance = Calendar.getInstance();
        System.out.println(instance);

        System.out.println("--------------");

        GregorianCalendar g = new GregorianCalendar();
        System.out.println(g);

3.2 字段属性介绍

  1. 通过字段属性,可以获取 日历的详情,如:年,月,日,等。
属性名称
YEAR
MONTH
DATE
HOUR小时
MINUTE
SECOND
DAY_OF_YEAR一年第几天
WEEK_OF_YEAR一年第几周
HOUR_OF_DAY24小时制
DAY_OF_WEEK_IN_MONTH当月中的第几周

3.3 常用方法

  1. public int get(int field) field 是常用属性字段。

  2. public final void set(int year, int month, int date, int hourOfDay,int minute)可以设置指定时间。
    还有其它重载方法public void set(int field, int value)。给字段设置指定值。

  3. public abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段

    public class Calendar_Demo {
        public static void main(String[] args) {
    
            //1.创建对象
            Calendar c = Calendar.getInstance();
            System.out.println(c); //打印日历类对象,包含很多属性字段
    
            Date time = c.getTime();//相当于new Date();
            System.out.println(time); // 返回当前时间
    
            /*
                2.通过 get(int field) 方法获取对象中字段属性。
                 需要注意的是,月份需要加1,Calendar计算月份是从0-11。
             */
    
            //2.1 获取月份  整体加 1;
            int month = (c.get(Calendar.MONTH)+1);
            System.out.println(month);
    
            //2.2 获取 年 月 日
            System.out.println(c.get(Calendar.YEAR)+" 年 "+(c.get(Calendar.MONTH)+1)+" 月 "+c.get(Calendar.DATE)+" 日");
            //可以将输出年月日封装一个方法
            outDateToString(c);
    
    
            //2.3 通过set();方法指定时间 11月份就是 12月 12月就是1月会自动进+1年
            //c.set(2046,12,12); // 2047 年 1月 12日
            c.set(2046,11,12); //11月就是12月
            outDateToString(c);
    
    
    
            //3. 根据当前时间获取指定往前还是往后的时间  2046 年 12 月 12 日
    
            c.add(c.DAY_OF_MONTH,-10);//获取10天之后 正数当前天往后,负数就是往前。
            outDateToString(c);
    
            c.add(c.YEAR,2);// 往前后2年
            outDateToString(c);
    
        }
    
        /**
         * 输出年月日
         * @param carlendar
         */
        public static void outDateToString(Calendar carlendar){
    
            System.out.println(carlendar.get(Calendar.YEAR)+" 年 "+(carlendar.get(Calendar.MONTH)+1)+" 月 "+carlendar.get(Calendar.DATE)+" 日");
        }
    }
    
    
    
  • 输出结果:

    java.util.GregorianCalendar[time=1653401631717,.... 省略
    Wed Nov 16 12:01:38 CST 2021
    11
    20211116202111162046121220461222048122

3.4 练习: 获取任意一年的2月有多少天!?

  1. 啥是闰年!?满足啥条件才可以!?
    • if(year%4==0&&year%100=0 || year%400==0){}
    • 还有其他解决问题方法么?
public class Calendar_Demo2 {
    public static void main(String[] args) {
        System.out.println("请输入任意年份:");
        int year = new Scanner(System.in).nextInt();

        //第一种方式:
       int days =  Calendar_Demo2.month(year);
        System.out.println(days);

        //第二种方式:
        String days2 = Calendar_Demo2.month2(year);
        System.out.println(days2);

    }

    /**
     * 计算方式 2
     * @param year
     * @return
     */
    private static String month2(int year) {
        //TODO 使用今天所学的知识..

        return  "";
    }

    /**
     * 计算2月有多少天
     *   普通闰年 year%4==0&&year%100==0
     *   世纪润年 year%400==0;
     * @param year 输入任意年份
     * @return int 类型 天数
     */
    private static int month(int year) {
        if (year%4==0&&year%100==0||year%400==0){
            return 29;
        }
        return 28;
    }


}

4. 扩展知识:正则表达式 RegEX

  1. 相当于一种“规则”,来描述或者匹配符合规则的一些字符串。相当于一种匹配字符串的方法,用来检查用户输入的内容是否符合要求(严格区分大小写的)。

4.1 常见字符

  1. 老吴认为: 这玩意不硬记!需要的时候去百度搜即可! 只需要理解意思就行。

速查表
在这里插入图片描述

4.2 String类提供的正则表达式的方法

  1. 是String类中的方法。
public boolean matches(String regex)  告知此字符串是否匹配给定的正则表达式。 

4.2 练习匹配手机号

  1. 简单的入门案例。
public class RegexDemo {
    public static void main(String[] args) {
        //1.控制台接受手机号
        System.out.println("请输入手机号: ");
        String iphone = new Scanner(System.in).next();


        /*2.匹配验证的正则:
            手机号:一共11位。 第一位肯定是1 后面跟10个数(必须是数字),可以重复!
         */
        String regex ="1[0-9]{10}";
        //3.然后需要判断
        if (iphone.matches(regex)){
            System.out.println(" 手机号正确,准备接受验证码...");
        }else{
            System.out.println("格式不对!");
        }
    }
}
  • 如果是匹配身份证号呢!? 怎么办!?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值