JDK 8之前日期和时间类——System类, java.util.Date类,java.sql.Date类,SimpleDateFormat时间格式类,Calender时间操作类及JDK8说明
1.System类中的currentTimeMillis()
返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,简称时间戳。
@Test
public void test1(){
long time = System.currentTimeMillis();
//返回时间戳
System.out.println(time);
}
2.java.util.Date类
|---java.sql.Date类
1.两个构造器的使用
>构造器一:Date():创建一个对应当前时间的Date对象
>构造器二:创建指定毫秒数的Date对象
2.两个方法的使用
>toString():显示当前的年、月、日、时、分、秒
>getTime():获取当前Date对象对应的毫秒数。(时间戳)
@Test
public void test2(){
//构造器一:Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());//Sat Feb 16 16:35:31 GMT+08:00 2019
System.out.println(date1.getTime());//1550306204104
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(1550306204104L);
System.out.println(date2.toString());
}
3. java.sql.Date类
是.java.util.Date类 的子类。更多的用在数据库这一块。对应着数据库中的日期类型的变量,
>如何实例化
>如何将java.util.Date对象转换为java.sql.Date对象
@Test
public void test3(){
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(35235325345L);
System.out.println(date3);//1971-02-13
//如何将java.util.Date对象转换为java.sql.Date对象
//情况一:子类转父类的,然后强转回子类
Date date4 = new java.sql.Date(2343243242323L);
java.sql.Date date5 = (java.sql.Date) date4;
//情况二:拿到父类生成的时间戳,放入子类构造器中
Date date6 = new Date();
java.sql.Date date7 = new java.sql.Date(date6.getTime());
}
4.SimpleDateFormat 是对时间显示的格式进行调整的类。
SimpleDateFormat对日期Date类的格式化和解析,主体是两个操作:
1.1 格式化:日期 --->字符串
1.2 解析:格式化的逆过程,字符串 ---> 日期
2.SimpleDateFormat的实例化,重载的构造器,填入你想要的时间格式,输入对应时间。
@Test
public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFormat:使用默认的构造器
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化:日期 --->字符串
Date date = new Date();
System.out.println(date);
String format = sdf.format(date);
System.out.println(format);
//解析:格式化的逆过程,字符串 ---> 日期
String str = "19-12-18 上午11:43";
Date date1 = sdf.parse(str);
System.out.println(date1);
//*************按照指定的方式格式化和解析:调用带参的构造器*****************
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);//2019-02-18 11:48:27
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
//否则,抛异常
Date date2 = sdf1.parse("2020-02-18 11:48:27");
System.out.println(date2);
}
5.java.util.Calendar 类,相当时间的操作类,对日期进行增删改查。
原本Date类中就有增删改查操作,但其中的方法都被废弃的。替代的是jdk1.1的Calendar 类。
首先Calendar类是一个抽象类,实例化可以调用其静态方法Calender.getInstance();返回的是其子类 GregorianCalender.
@Test
public void testCalendar(){
//1.实例化
//方式一:创建其子类(GregorianCalendar)的对象
//方式二:调用其静态方法getInstance()
Calendar calendar = Calendar.getInstance();
// System.out.println(calendar.getClass());
//2.常用方法
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
//set()
//calendar可变性
calendar.set(Calendar.DAY_OF_MONTH,22);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
//add()
calendar.add(Calendar.DAY_OF_MONTH,-3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
//getTime():日历类---> Date
Date date = calendar.getTime();
System.out.println(date);
//setTime():Date ---> 日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
6. 就以jdk8之前上类,很难满足我们程序员对时间表达的需求。比如希望时间跟昼夜和四季有关等。
就以上类,还面临的问题有:
1.偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
2.格式化:格式化只对Date有用,Calendar则不行。时间各个类表示不同的操作,表现出它的复杂性了。
3.可变性:像日期和时间这样的类应该是不可变的。
4.她们不是线程安全的,不能处理闰秒等等......
他们都是说,对日期和时间的操作一直都是Java程序员最痛苦的地方之一
所以引入了jdk8中新日期时间的API
java.time基础包
java.time.format格式解释包
java.time.chrono 对不同日历系统访问包
java.time.temporal 包括底层框架和扩展特性包
java.time.zone 包含时区支持类的包
说明一下:大多数开发者只会用到基础包和format包。因此,尽管更新了68公开类型,大多数开发着,大概只用到了其中的三分之一。
如:java.time.LocalDateTime,java.time.LocalDate,java.time.LocalTime;等等
一个程序员的自我修养和成长........