文章目录
1. 简单介绍 Date类
1.1 概述
- 时间戳,获取日期和时间。 表示日期和时间的类,在
java.util.Date
下。- 表示当前距 1970年1月1日00:00:00时间的毫秒数。为什么会从1970年开始?。
- 换算关系: 精确到毫秒(1000毫秒 = 1秒)。
1.2 创建对象
-
Date
类,内部设计的是一个long类型的值,并且返回的类型是long
类型,需要转换。 -
通常将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();
- Date 转 Long类型
1.3 Long与Date互相转换
- 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 创建对象
-
为了能让使用者读懂Date日期输出,变得有意义, 就会使用日期格式化工具类。
- DateFormat类是抽象类 ,无法创建对象就需要使用其,实现类 SimpleDateFormat。
- 返回的是
String
类型。
new SimpleDateFormat(模式); 日期和时间模式: 推荐格式:yyyy-MM-dd HH:mm:ss
-
如何使用格式化日期类。
- 验证时间从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互相转换
-
需要掌握的方法功能,字符串到Date之间转换(都是使用的父类DateFormat方法)。
- 从Date类型–>String,
format(Date)
。 - 从String 转换到Date
parse(String )
。
- 从Date类型–>String,
-
注意,时间的类型要与解析方法保持一致。
/** 日期: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 练习:计算在地球生活的天数!
-
需求:用户控制台输入自己的,出生年月日,计算自己在地球存活天数。
- 提示: 控制台接收的是String类型的出生年月日,
- 如果计算需要使用数值类型long类型 中间需要经过 Date类型。。
- 使用当前日期减去出生日期即可。
-
其实可以这么理解:
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类 (简单介绍)
public abstract class Calendar
日历类,抽象的,不能直接创建对象。- 作用: 可以单独获取日历上得某段属性。
3.1 创建对象
- 虽然是抽象类,但是可以通过调用静态方法来创建对象。
- 底层也是调用子类,多态的形式。
- 发现输出结果是一样的。
Calendar instance = Calendar.getInstance();
System.out.println(instance);
System.out.println("--------------");
GregorianCalendar g = new GregorianCalendar();
System.out.println(g);
3.2 字段属性介绍
- 通过字段属性,可以获取 日历的详情,如:年,月,日,等。
属性 | 名称 |
---|---|
YEAR | 年 |
MONTH | 月 |
DATE | 日 |
HOUR | 小时 |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_YEAR | 一年第几天 |
WEEK_OF_YEAR | 一年第几周 |
HOUR_OF_DAY | 24小时制 |
DAY_OF_WEEK_IN_MONTH | 当月中的第几周 |
3.3 常用方法
-
public int get(int field)
field 是常用属性字段。 -
public final void set(int year, int month, int date, int hourOfDay,int minute)
可以设置指定时间。
还有其它重载方法public void set(int field, int value)
。给字段设置指定值。 -
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 2021 年 11 月 16 日 2021 年 11 月 16 日 2046 年 12 月 12 日 2046 年 12 月 2 日 2048 年 12 月 2 日
3.4 练习: 获取任意一年的2月有多少天!?
- 啥是闰年!?满足啥条件才可以!?
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
- 相当于一种“规则”,来描述或者匹配符合规则的一些字符串。相当于一种匹配字符串的方法,用来检查用户输入的内容是否符合要求(严格区分大小写的)。
4.1 常见字符
- 老吴认为: 这玩意不硬记!需要的时候去百度搜即可! 只需要理解意思就行。
4.2 String类提供的正则表达式的方法
- 是String类中的方法。
public boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
4.2 练习匹配手机号
- 简单的入门案例。
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("格式不对!");
}
}
}
- 如果是匹配身份证号呢!? 怎么办!?