欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math

程序员文章站 2022-06-28 17:07:53
Java学习笔记_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math课程内容正则表达式DateDateFormatSimpleDateFormatCalendarMath一、正则表达式(一)概述就是一个字符串(regex)作用:不仅表示一个字符换,还可以表示一类字符串,表示一类字符串的格式或者规则好处:可以使用特别简单的代码,表示非常复杂的逻辑坏处:很难写出正确的正则(二)正则表达式的好处需求:键盘录入...

Java学习笔记_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math

课程内容

  1. 正则表达式
  2. Date
  3. DateFormat
  4. SimpleDateFormat
  5. Calendar
  6. Math

一、正则表达式

(一)概述

  1. 就是一个字符串(regex)
  2. 作用:不仅表示一个字符换,还可以表示一类字符串,表示一类字符串的格式或者规则
  3. 好处:可以使用特别简单的代码,表示非常复杂的逻辑
  4. 坏处:很难写出正确的正则

(二)正则表达式的好处

需求:键盘录入一个字符串,判定这个字符串是否为一个合法的QQ号
合法QQ的条件:必须全是数字;必须在5-15位;0不能开头

代码示例

package com.wanghong.day_013;

import java.util.Scanner;

public class Demo01 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请录入一个QQ:");
		String qq = sc.nextLine();
		
		System.out.println(isQQByRegex(qq));
	}
	
	/**
	 * 通过正则表达式判断是否为合法QQ
	 */
	public static boolean isQQByRegex(String qq) {
		return qq.matches("[1-9][0-9]{4,14}");
	}

	/**
	 * 判断是否为一个合法QQ号
	 */
	public static boolean isQQ(String qq) {
		//必须全是数字
		if(!isAllNum(qq)) {
			return false;
		}
		
		//必须在5-15位
		if(!illegalLength(qq)) {
			return false;
		}
		
		//0不能开头
		if(start0(qq)) {
			return false;
		}
		
		return true;
		
	}

	/**
	 * 判断是否是0开头
	 * @return 如果以0开头返回true
	 */
	public static boolean start0(String qq) {
		
		return qq.startsWith("0");
	}

	/**
	 * 字符串长度必须在5-15位,如果不是则返回false
	 * @return 长度不合法返回false
	 */
	public static boolean illegalLength(String qq) {
		
		return qq.length() >= 5 && qq.length() <= 15;
	}

	/**
	 * 判断参数字符串中,是否含有非数字
	 * @return 
	 */
	public static boolean isAllNum(String qq) {
		
		//1.将字符串转为字符数组
		char[] arr = qq.toCharArray();
		
		//2.获取每一个字符
		for (int i = 0; i < arr.length; i++) {
			char ch = arr[i];
			
			if(!(ch >= '0' && ch <= '9')) {
				return false;
			}
		}
		
		return true;
	}

}

(三)正则表达式的字符类

  1. 普通的字符串也是一个正则表达式,但是只能表示他自己
  2. 判断某个字符串是否和某个正则表达式匹配,需要使用String类中的matches方法
  3. 字符类型:表示单个字符,使用符号[],只要使用了[],无论里面写多少内容 ,都表示单个字符,只是允许出现[]里面内容的其中之一

代码示例

package com.csdn.demos;

import java.util.Scanner;

/**
 * 	需求:键盘录入一个字符串,判定这个字符串是否为一个合法的QQ号
	合法QQ的条件:必须全是数字;必须在5-15位;0不能开头
 *
 */
public class Demo01_Regex {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请录入一个QQ:");
		String qq = sc.nextLine();
		
		//System.out.println(isQQ(qq));
		
		System.out.println(isQQByRegex(qq));
	}

	/**
	 * 通过正则表达式判断是否为合法QQ
	 */
	public static boolean isQQByRegex(String qq) {
		return qq.matches("[1-9][0-9]{4,14}");
	}

	/**
	 * 判断是否为一个合法QQ号
	 */
	public static boolean isQQ(String qq) {
		//必须全是数字
		if(!isAllNum(qq)) {
			return false;
		}
		
		//必须在5-15位
		if(!illegalLength(qq)) {
			return false;
		}
		
		//0不能开头
		if(start0(qq)) {
			return false;
		}
		
		return true;
		
	}

	/**
	 * 判断是否是0开头
	 */
	public static boolean start0(String qq) {
		
		return qq.startsWith("0");
	}

	/**
	 * 字符串长度必须在5-15位,如果不是则返回false
	 */
	public static boolean illegalLength(String qq) {
		
		return qq.length() >= 5 && qq.length() <= 15;
	}

	/**
	 * 判断参数字符串中,是否含有非数字
	 */
	public static boolean isAllNum(String qq) {
		
		//1.将字符串转为字符数组
		char[] arr = qq.toCharArray();
		
		//2.获取每一个字符
		for (int i = 0; i < arr.length; i++) {
			char ch = arr[i];
			
			if(!(ch >= '0' && ch <= '9')) {
				return false;
			}
		}
		
		return true;
	}
}

(四)正则表达式的预定义字符类

  1. 有一些字符经常使用,所以就提前在正则表达式中进行了定义,称为预定义字符类
  2. 预定义字符中的\不是转义字符,就是一个普通的反斜杠,例如:\d,就是一个整体,而不是通过转义字符转换了d原本的含义,所以在Java代码中书写的时候要写成【\d】
  3. 预定义字符也仅仅表示单个位置
  4. 预定义字符中的【.】表示任意字符,如果在代码中直接书写【.】,就是通配,如果想要表示普通的点,必须写成【\.】

代码示例

package com.csdn.demos;

public class Demo03_Defined {
	
	public static void main(String[] args) {
		
	}

	public static void test5() {
		String regex = "\\w";
		
		System.out.println("z".matches(regex));
		System.out.println("0".matches(regex));
		System.out.println("_".matches(regex));
		System.out.println("$".matches(regex));
		System.out.println("@".matches(regex));
	}

	public static void test4() {
		//空白字符:空格,\t,\n,\r
		//\n:换行
		//\r:回车
		//在windows中,\n\r没有任何区别
		//在linux中,\n\r有区别
		String regex = "\\s";
		
		System.out.println(" ".matches(regex));
		System.out.println("	".matches(regex));
		System.out.println("\n".matches(regex));
		System.out.println("\t".matches(regex));
		System.out.println("\r".matches(regex));
	}

	public static void test3() {
		String regex = "\\d\\D";
		
		System.out.println(" ".matches(regex));
		System.out.println("3M".matches(regex));
		System.out.println("3#".matches(regex));
		System.out.println("3*".matches(regex));
	}

	public static void test2() {
		String regex = "\\d";
		
		System.out.println("1".matches(regex));
		System.out.println("a".matches(regex));
	}

	public static void test1() {
		//预定义字符本身就是一个普通的反斜杠和一个普通的字符组成,是一个整体
		//而非,通过转移字符将一个字符原本的意义转换
		//\t tab
		//String regex = "\\d";
		
		String regex = "Hello.java";
		
		System.out.println("Hello&java".matches(regex));
	}
}

(五)数量词

  1. 无论字符类还是预定义字符类,都只能表示单个位置的字符,如果想要表示没有或者多个位置的字符,就需要借助数量词来实现
  2. 注意事项:数量词只能修饰左侧紧挨着它的那一个位置的字符
  3. 分类:
    (1) 模糊数量词:X?、X*、X+
    (2) 精确数量词:{n}、{n, }、{n, m}

代码示例

package com.csdn.demos;

public class Demo04_Number {
	
	public static void main(String[] args) {
		
	}

	public static void test6() {
		String regex ="qwe[abc]{2,}[ab]{2,5}";
		
		System.out.println("qweabbbbbbabb".matches(regex));
	}

	public static void test5() {
		String regex = "aa[#$&]{3,}";
		
		System.out.println("aa#$&#$&&&&&#####".matches(regex));
		System.out.println("aa###".matches(regex));
	}

	public static void test4() {
		String regex = "admin:\\w{5}";
		
		System.out.println("admin:abc".matches(regex));
		System.out.println("admin: qwert".matches(regex));
		System.out.println("admin:1234_".matches(regex));
	}

	public static void test3() {
		String regex = "a+";
		
		System.out.println("aa".matches(regex));
		System.out.println("aaaaaaaaaaaaaa".matches(regex));
	}

	public static void test2() {
		String regex = "qq[^abc]*";
		
		System.out.println("qq".matches(regex));
		System.out.println("qq!@#$%^&*(".matches(regex));
		System.out.println("qqq".matches(regex));
	}

	public static void test1() {
		String regex = "a\\w?";
		
		System.out.println("aa".matches(regex));
		System.out.println("a_".matches(regex));
		System.out.println("a".matches(regex));
		System.out.println("aaa".matches(regex));
	}
}

二、Date类

  1. 该类的对象用于表示一个特定的瞬间,精确到毫秒值,根据调用的构造方法不同,能表示不同的瞬间
  2. 构造方法:
    (1) Date() 表示创建对象刹那的时间
    (2) Date(long date) 表示传入毫秒值的时间,是从1970年1月1日0时0分0秒起开始计算
  3. 成员方法:
    (1) getTime() 获取Date对象表示的时间的毫秒值
    (2) setTime(long time) 将调用者对象的毫秒值设置为指定值

代码示例

package com.csdn.demos;

import java.util.Date;

public class Demo05_Date {
	
	public static void main(String[] args) {
		new Date("123");
	}

	public static void test1() {
		//Wed Nov 04 14:11:40 CST 2020
		//2020/11/4
		//20:20:20
		//Date对象能够表示时间,具有一定的时间
		Date d = new Date();//表示时间的毫秒值
		System.out.println(d);
		
		System.out.println(d.getTime());
		
		d.setTime(60000);
		
		System.out.println(d);
		
		/*Date d1 = new Date(0);
		System.out.println(d1);
		
		Date d2 = new Date(600000);
		System.out.println(d2);*/
	}
}

三、DateFormat类

  1. 直接打印Date对象得到的日期格式不好阅读,我们需要一个能够对时间进行格式化的对象,将Date表示的时间格式化为我们便于阅读的格式
  2. DateFormat是个抽象类,不能创建对象,将来使用其子类穿件对象,有一个已知子类:SimpleDateFormat
  3. DateFormat在text包下,需要导包
  4. 重要成员方法:
    (1)Format(Date date) 将参数对象,格式化为一定的日期格式,结果是一个字符串 Date -> String
    (2)parse(String date) 将参数字符串表示的时间解析为一个Date对象 String -> Date

四、SimpleDateFormat

(一)simpleDateFormat的使用

  1. DateFormat是一个抽象类无法实例化,所以使用其子类创建对象,并且调用方法,使用SimpleDateFormat类型,可以使用DateFormat类中的所有方法
  2. 构造方法:
    (1) SimpleDateFormat() 使用默认的格式解析时间对象,默认格式:20-11-4 下午3:00
    (2) SimpleDateFormat(String pattern) 使用给定的格式解析时间对象
  3. 常用模式:
    Java_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math

Java_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math

代码示例

package com.csdn.demos;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo06_SimpleDateFormat {
	
	public static void main(String[] args) throws ParseException {
		String time = "2020/11/4 15:11:20";
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		Date date = sdf.parse(time);
		
		System.out.println(date);
		
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		String str = sdf1.format(date);
		
		System.out.println(str);
	}

	public static void test2() {
		Date d = new Date();
		
		//SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		//SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		System.out.println(sdf.format(d));
	}

	public static void test1() {
		Date d = new Date();//原料
		
		SimpleDateFormat sdf = new SimpleDateFormat();//模具
		
		String result = sdf.format(d);
		
		System.out.println(result);
	}
}

(二)Date练习

键盘录入自己的生日,计算今天是自己出生的第几天

代码示例

package com.csdn.demos;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 键盘录入自己的生日,计算今天是自己出生的第几天
 * 
 * @author Zihuatanejo
 *
 */
public class Demo07_DateExercise {
	
	public static void main(String[] args) throws ParseException {
		Scanner sc = new Scanner(System.in);
		
		//1.键盘录入生日字符串
		System.out.println("请录入自己的生日,按照格式:2000-11-11录入:");
		String birthday = sc.nextLine();
		
		//2.使用日期格式化对象将生日字符串解析为Date对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date birDate = sdf.parse(birthday);
		
		//3.获取当前的日期时间
		long today = System.currentTimeMillis();
		
		//4.从生日Date对象中获取毫秒值时间
		long birMillis = birDate.getTime();
		
		//5.求差值,求出出生多少天
		System.out.println((today - birMillis) / 1000 / 60 / 60 / 24 + "天");
	}
}

五、Calendar类

(一)概述

  1. 表示一个精确的瞬间,包含了非常多的日历字段
  2. 在 util 包下,需要导包
  3. Calendar 类是抽象类,不能创建对象,解决:
    (1) 直接使用子类创建对象
    (2) 调用静态成员方法,返回实现子类对象
  4. 获取 Calendar 类是抽象类的对象方式:
    Calendar.getInstance():可以获取到Calendar的实现对象,此对象获取到的时候,就包含了所有的日历字段
  5. 常用方法:
    (1) get、set方法用于给对象时间赋值
    (2) add方法可一给对象的某个字段值增加时间
    (3) getTimeMillis获取对象中的时间毫秒

(二)get 方法

  1. 直接打印Calendar对象,可以展示所有的字段值,需要获取某个确定的字段值,就需要使用get方法
  2. get(int field) 传入字段序号,可以返回具体的字段值
  3. 注意事项:
    (1) 月份是0-11,所以月份获取到以后要+1
    (2) 星期是从星期天开始,所以获取到序号要-1

代码示例

package com.csdn.demos;

import java.util.Calendar;

public class Demo09_CalendarGet {
	
	public static void main(String[] args) {
		//1.获取Calendar对象
		Calendar ca = Calendar.getInstance();
		
		/*System.out.println(ca.get(1));//1:年
		System.out.println(ca.get(2));//2:月
		System.out.println(ca.get(3));//3:月*/
		
		System.out.println(ca.get(Calendar.YEAR));
		System.out.println(ca.get(Calendar.MONTH));//记得月份+1
		System.out.println(ca.get(Calendar.DATE));
		
		System.out.println(ca.get(Calendar.HOUR_OF_DAY));
		System.out.println(ca.get(Calendar.MINUTE));
		System.out.println(ca.get(Calendar.SECOND));
	}
}

(三)set 方法

  1. 可以针对具体的日历字段对应的设置值
  2. 方法:
    (1) set(int field, int value) 指定日历字段,设置为指定的值
    (2) set(int year, int month, int date, int hourOfDay, int minute, int second) 设定Calendar对象的年月日时分秒字段的值,其余字段值保持不变
  3. 注意:set 方法只会修改制定字段,没有被指定的字段值保持不变

代码示例

package com.csdn.demos;

import java.util.Calendar;

public class Demo10_CalendarSet {
	
	public static void main(String[] args) {
		Calendar ca = Calendar.getInstance();
		
		System.out.println(ca);
		System.out.println(ca.get(Calendar.YEAR));
		
		//ca.set(Calendar.YEAR, 1999);
		ca.set(1999, 1, 1, 10, 55, 26);
		
		System.out.println(ca);
		System.out.println(ca.get(Calendar.YEAR));
	}
}

(四)add 方法

  1. 方法功能:在某个日历字段现有的时间基础上,添加一些时间,让时间进行偏移
  2. 注意事项:如果当前时间不够存储偏移的时间,会自动按照时间的规则向上进

代码示例

package com.csdn.day013;

import java.util.Calendar;

public class Demo11_CalendarAdd {
	
	public static void main(String[] args) {
		Calendar ca = Calendar.getInstance();
		
		System.out.println(ca);
		
		ca.add(Calendar.DATE, 27);
		
		System.out.println(ca);
	}
}

(五)练习

输入一个年份,判断这一个年是闰年还是平年

代码示例

package com.offcn.demos;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Scanner;

//输入一个年份,判断这一个年是闰年还是平年
public class Demo12_Exercise {
	
	public static void main(String[] args) throws ParseException {
		//1.键盘录入一个年份
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请录入年份:");
		int year = sc.nextInt();
		
		//2.获取Calendar对象
		Calendar ca = Calendar.getInstance();
		
		ca.set(year, 1, 28);
		
		//3.在日期上加上1天的偏移
		ca.add(Calendar.DATE, 1);
		
		//4.获取日期,如果为29号,就是闰年,如果为1号就是平年
		String result = ca.get(Calendar.DATE) == 29 ? "闰年" : "平年";
		
		System.out.println(result);
	}
}

总结:加油吧,少年!

本文地址:https://blog.csdn.net/xxxx1982/article/details/109499878