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
课程内容
- 正则表达式
- Date
- DateFormat
- SimpleDateFormat
- Calendar
- Math
一、正则表达式
(一)概述
- 就是一个字符串(regex)
- 作用:不仅表示一个字符换,还可以表示一类字符串,表示一类字符串的格式或者规则
- 好处:可以使用特别简单的代码,表示非常复杂的逻辑
- 坏处:很难写出正确的正则
(二)正则表达式的好处
需求:键盘录入一个字符串,判定这个字符串是否为一个合法的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;
}
}
(三)正则表达式的字符类
- 普通的字符串也是一个正则表达式,但是只能表示他自己
- 判断某个字符串是否和某个正则表达式匹配,需要使用String类中的matches方法
- 字符类型:表示单个字符,使用符号[],只要使用了[],无论里面写多少内容 ,都表示单个字符,只是允许出现[]里面内容的其中之一
代码示例
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;
}
}
(四)正则表达式的预定义字符类
- 有一些字符经常使用,所以就提前在正则表达式中进行了定义,称为预定义字符类
- 预定义字符中的\不是转义字符,就是一个普通的反斜杠,例如:\d,就是一个整体,而不是通过转义字符转换了d原本的含义,所以在Java代码中书写的时候要写成【\d】
- 预定义字符也仅仅表示单个位置
- 预定义字符中的【.】表示任意字符,如果在代码中直接书写【.】,就是通配,如果想要表示普通的点,必须写成【\.】
代码示例
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) 模糊数量词: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) Date() 表示创建对象刹那的时间
(2) Date(long date) 表示传入毫秒值的时间,是从1970年1月1日0时0分0秒起开始计算 - 成员方法:
(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类
- 直接打印Date对象得到的日期格式不好阅读,我们需要一个能够对时间进行格式化的对象,将Date表示的时间格式化为我们便于阅读的格式
- DateFormat是个抽象类,不能创建对象,将来使用其子类穿件对象,有一个已知子类:SimpleDateFormat
- DateFormat在text包下,需要导包
- 重要成员方法:
(1)Format(Date date) 将参数对象,格式化为一定的日期格式,结果是一个字符串 Date -> String
(2)parse(String date) 将参数字符串表示的时间解析为一个Date对象 String -> Date
四、SimpleDateFormat
(一)simpleDateFormat的使用
- DateFormat是一个抽象类无法实例化,所以使用其子类创建对象,并且调用方法,使用SimpleDateFormat类型,可以使用DateFormat类中的所有方法
- 构造方法:
(1) SimpleDateFormat() 使用默认的格式解析时间对象,默认格式:20-11-4 下午3:00
(2) SimpleDateFormat(String pattern) 使用给定的格式解析时间对象 - 常用模式:
代码示例
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类
(一)概述
- 表示一个精确的瞬间,包含了非常多的日历字段
- 在 util 包下,需要导包
- Calendar 类是抽象类,不能创建对象,解决:
(1) 直接使用子类创建对象
(2) 调用静态成员方法,返回实现子类对象 - 获取 Calendar 类是抽象类的对象方式:
Calendar.getInstance():可以获取到Calendar的实现对象,此对象获取到的时候,就包含了所有的日历字段 - 常用方法:
(1) get、set方法用于给对象时间赋值
(2) add方法可一给对象的某个字段值增加时间
(3) getTimeMillis获取对象中的时间毫秒
(二)get 方法
- 直接打印Calendar对象,可以展示所有的字段值,需要获取某个确定的字段值,就需要使用get方法
- get(int field) 传入字段序号,可以返回具体的字段值
- 注意事项:
(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) set(int field, int value) 指定日历字段,设置为指定的值
(2) set(int year, int month, int date, int hourOfDay, int minute, int second) 设定Calendar对象的年月日时分秒字段的值,其余字段值保持不变 - 注意: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 方法
- 方法功能:在某个日历字段现有的时间基础上,添加一些时间,让时间进行偏移
- 注意事项:如果当前时间不够存储偏移的时间,会自动按照时间的规则向上进
代码示例
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
推荐阅读
-
16_常用API_第16天(正则表达式、Date、DateFormat、Calendar)_讲义
-
Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar
-
Java_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math
-
<时间-2>Date & DateFormat & SimpleDateFormat & Calendar
-
16_常用API_第16天(正则表达式、Date、DateFormat、Calendar)_讲义
-
Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar
-
Java_Day013_正则表达式、Date、DateFormat、SimpleDateFormat、Calendar、Math