摘要
Java基础加强重温_04:
日期时间类【时间类Date、格式转换类DateFormat、日历类Calendar(与Date互转)】、
System类(exit、currentTimeMillis、数组复制arraycopy)、
BigDecimal类(加减乘除解决精度丢失)、
StringBuilder类(字符串拼接)、
包装类(基本类型与包装类,装箱拆箱,自动装箱拆箱)、
泛型【泛型类、泛型方法、泛型接口、泛型通配符(向上限定,向下限定)】、
Collection集合(单列集合,List,set,常用功能)
一、常用API–日期时间类
1、Date类
java.util.Date类表示特定的瞬间(年月日时分秒),精确到毫秒。
面试题
月份的表示是以0-11代表1-12月。即0代表1月,1代表2月,…
标准基准时间(称为“时代”)即1970年1月1日00:00:00 GMT
今年为什么是2020,因为选了个起点时间,2020年前,耶稣诞生。
Date也是选了起点,UNIX系统诞生的时间。MAC,IOS就是基于UNIX改的,LINUX也是UNIX的免费版,ANDROID基于LINUX。UNIX系统诞生约1969,所以找了 1970年1月1日 0时0分0秒作为语言时间相关类开始的时间
Date精确到毫秒。Date有参构造方法中有个long变量,表示从标准基准时间开始到现在累计的毫秒数。
秒与毫秒换算
1s=1000ms=10^3ms ,秒:SECOND,毫秒:MILLISECOND
Date类构造方法
public Date() :分配一个Date对象并对其进行初始化,表示当前的时间(年月日时分秒,格式为系统默认格式)
public Date(long date) :分配一个Date对象并将其初始化,表示从标准基准时间起,过去指定毫秒数后的时间(年月日时分秒,格式为系统默认格式)。
简单来说:
使用无参构造,可以自动设置当前系统时间的毫秒时刻。
- 即new出来的date对象默认拿到的是当前时间(年月日时分秒);
指定long类型的构造参数,可以自定义毫秒时刻。
- 即参数传入毫秒数,new出来的date对象拿到的是从1970年1月1日00:00:00(标准基准时间,称为“时代”),经过了这个毫秒数后的时间(年月日时分秒)。
import java.util.Date;
public class Demo01Date {
public static void main(String[] args) {
// 创建日期对象,把当前的时间日期转换成日期对象
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
// 创建日期对象,把当前的毫秒值转成日期对象
System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
}
}
在使用println方法时,会自动调用Date类中的toString方法。Date类已经对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。
Date类普通方法:
long getTime() 返回自1970年1月1日以来,到当前Date对象日期时间累计过去的毫秒数。
void setTime(long time) 修改Date对象的时间,设置为1970年1月1日00:00:00 的基础上加上参数指定毫秒数,与 new Date(long time)效果差不多
//访问格式
Date类对象.getTime();
Date类对象.setTime(long time);
代码示例
public class TestDate {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date); // Fri Apr 03 01:00:22 CST 2020
long time = date.getTime();
System.out.println(time); //1585846822673
date.setTime(0);
System.out.println(date); //Thu Jan 01 08:00:00 CST 1970 (基准标准时间,中国是UTC+8八区,中国本地时间要在以上标准时间上面加8小时。)
date.setTime(3600000);
System.out.println(date); // Thu Jan 01 09:00:00 CST 1970
}
}
2、DateFormat类(SimpleDateFormat)
java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
DateFormat类的作用:
Date对象与String的互转
- 1、格式化:把Date对象转为更好看的String
- 2、解析:把表达日期String解析回Date对象
为什么要DateFormat类:
Date转String
Date主要表示1970年到某个时间的毫秒值(date对象),如果输出给用户看,用户是看不太懂的:
- “Thu Oct 25 21:41:33 CST 2018”
用户实际上比较喜欢(String对象)
- “2018年10月25日 21时41分33秒”
String转Date
因为前端传给后台往往是String,所以要转回Date对象
DateFormat类创建对象(通过子类SimpleDateFormat)
由于DateFormat为抽象类,不能直接使用,所以需要通过它的常用的子类 java.text.SimpleDateFormat创建,SimpleDateFormat就是为了达到DateFormat的效果而存在。这个类需要一个模式(格式)来指定格式化或解析的标准。
public SimpleDateFormat(String pattern) :用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
//参数pattern是一个字符串,结合格式规则,代表日期时间的自定义格式。
给定模式
理解:给定如何格式化Date对象的模式,以年月日时分秒区分:“2020年3月30日11时30分20秒”。或以/,:区分:“2020/3/30 11:30:20”
默认语言环境的日期格式符号(格式规则)
- 年:yyyy
- 月:MM
- 日:dd
- 时:HH
- 分:mm
- 秒:ss
理解:
格式化时,这些符号会提取Date对象里面时间的数字,转换成自定义格式。
解析时,这些符号会提取字符串里面对应位置的数字,转换成系统默认格式
20190928101801: yyyyMMddHHmmss
更详细的格式规则,可以参考SimpleDateFormat类的API文档。
DateFormat类常用方法
public String format(Date date) :将Date对象格式化为字符串。
public Date parse(String source) :将字符串解析为Date对象。
3、DateFormat类案例
需求1:
将当前时间的Date对象 转成 “2018年9月15日 19时18分19秒”
public class Demo02 {
public static void main(String[] args) throws ParseException {
//SimpleDateFormat继承了DateFormat,所以format方法
//final修饰的方法无法被重写,所以被继承 这是错的
//需求:将 当前时间的Date对象 转成 "2018年09月15日 19时18分19秒"
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 ^.^ HH时mm分ss秒");
Date date = new Date();
String formatDate = sdf.format(date);
System.out.println("formatDate = " + formatDate); //2019/9/28 上午9:53
}
}
需求2
将字符串 “2007-12-26 10:13:31” 转成 Date对象
public class Demo02 {
public static void main(String[] args) throws ParseException {
//需求:将字符串 "2007-12-26 10:13:31" 转成 Date对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2007-12-26 10:13:31";
//解析
//光标移动到红色波浪线->alt+enter->选第一个,自动导包
Date date2 = sdf2.parse(dateString);
System.out.println("date2 = " + date2);
}
}
3、Calendar类
Date类的缺点: 对日期的加减比较繁琐,获取日期的 属性(年,月,日…)很多方法已经过期。
java.util.Calendar 是日历类,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。
理解:Calendar对象里面存储的数据就是Date对象转换为String对象的那些年月日时分秒,如:xxxx年xx月xx日xx时xx分xx秒
Calendar的作用:简化日期的操作,获取属性
获取Calendar对象,getInstance方法
Calendar为抽象类,不能直接创建对象,而是通过子类GregorianCalendar的静态方法getInstance创建。
- 在该方法中通过多态方式,一系列的初始化,最后获得并返回Calendar对象。
Calendar的子类静态方法
public static Calendar getInstance() :使用默认时区和语言环境获得一个日历
获取Calendar对象
Calendar cal = Calendar.getInstance();
Calendar类常用方法
int get(int field) 返回给定日历属性/字段的值。
public void set(int field, int value) :将给定的日历字段设置为给定值。
void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
与Date实现转换
Date getTime(): 日历对象获取Date对象。理解:将Calendar对象当前的年月日时分秒数据转换成Date对象
setTime(Date date): 日历对象通过Date对象设置时间。理解:将Date对象的年月日时分秒数据替换到当前的Calendar对象
Calendar中的属性/字段
Calendar类中提供很多成员常量,代表给定的日历字段
4、Calendar类案例
Calendar、Date对象互转
//抽取方法:选中需要提取的代码,快捷键:ctrl+alt+m 起个方法名 回车
private static void test04() {
//Date对象转Calendar对象。将Date的年月日时分秒数据替换到当前的Calendar对象
//setTime(Date date): 日历对象通过Date对象设置时间
Calendar cal = Calendar.getInstance();
Date date = new Date(-1000);//1970 08:00:00
cal.setTime(date); //理解:将当前时间设置进日历即将Date对象转换成Calendar
System.out.println("cal = " + cal);
//Calendar对象转Date对象。将Calendar对象当前的年月日时分秒数据转换成Date对象
//Date getTime(): 日历对象获取Date对象
Date date2 = cal.getTime();
System.out.println("date2 = " + date2);
}
获取日历对象属性/字段(年月日时分秒)
private static void test02() {
//Calendar怎么获取对象 public static Calendar getInstance()
Calendar cal = Calendar.getInstance();
System.out.println(cal);
//1代表年
int year = cal.get(Calendar.YEAR);
System.out.println("year = " + year);
//因为月份从0开始
int month = cal.get(Calendar.MONTH)+1;
System.out.println(