常用时间类有Date,Calendar,LocalDate,SimpleDateFormat,时间戳等等。
使用new Date() 创建时,如图,忽略sun.util包,创建Date 主要是util包和sql包两种方式;
使用的是idea编辑器,可通过快捷键ctrl+h 查看类关系,如下图,sql.Date类继承于util包。
Date主要使用无参构造和long类型创建,其余已过时。
Date date=newDate();//接收一个 long 类型的参数,该参数是从 1970-01-01 00:00:00.000 到当前时间的毫秒数 Date date2=newDate(1574673617000L); System.out.println(date); System.out.println(date2);
//显示结果,默认时间格式如下 Mon Nov2517:20:59 CST2019 Mon Nov2517:20:17 CST2019
date主要方法
//使用上面创建的date和date2 System.out.println(date.compareTo(date2)); System.out.println(date2.compareTo(date)); System.out.println(date2.compareTo(newDate(1574673617000L)));
//显示结果如下//将需要比较的日期和括号内日期相比较1//括号内日期比前面日期小-1//括号内日期比前面日期大0//两日期相等
Object clone= date.clone();
//获取时间毫秒数long time= date.getTime(); System.out.println(date.getTime());
//判读时间前后boolean before= date.before(date2);boolean after= date.after(date2);
Instant instant= date.toInstant(); System.out.println(instant);
//显示标准时间,时区相差82019-11-25T09:55:27.543Z
Date from= Date.from(instant); System.out.println(from);
下面一些过时方法,使用Clandar类方法代替了
发现sql包下的Date类没有无参构造方法,使用util包的Date注入一个long类型的date
Date date=newDate(newjava.util.Date().getTime()); System.out.println(date);
//显示结果,日期格式如下,说明sql包的Date类重写了toString 方法,没有了详细时间2019-11-25
sql包下的Date类继承于util包的Date,方法基本一致,sql包的Date只有日期,适用于sql,一般使用util包就行。
//转换成LocalDate LocalDate localdate= date.toLocalDate();
不同点
1. java.sql.date是针对sql使用的,只有日期部分,没有时间部分
2. java.util.date是java.sql.date的父类
之间的转换关系
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
Calendar是一个抽象类不能像Date类直接通过new创建。通过内部的getInstance方法创建。
Calendar instance= Calendar.getInstance(); System.out.println(instance);
//显示结果,默认toString比较复杂 java.util.GregorianCalendar[time=1574735939207,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=26,DAY_OF_YEAR=330,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=38,SECOND=59,MILLISECOND=207,ZONE_OFFSET=28800000,DST_OFFSET=0]
常用方法如下
//和Date类方法类似,返回值1//括号内日期比前面日期小-1//括号内日期比前面日期大0//两日期相等int i= instance.compareTo(Calendar.getInstance());
//返回Date类 Date time= instance.getTime(); System.out.println(time);
//传入Calendar类定义的常量,返回对应信息int i1= instance.get(Calendar.DAY_OF_WEEK);int i2= instance.get(Calendar.DAY_OF_MONTH); System.out.println(i1); System.out.println(i2);//326
//设置时间,传入Date类型 instance.setTime(newDate());
//设置时间,通过Calendar常量 instance.set(Calendar.YEAR,2019); instance.set(Calendar.MONTH,11);//直接设置,后面还可以接时分秒 instance.set(2019,11,26);
前面sql包Date类的toLocalDate()方法,就是将其转换成新日期类。
Java 8新增了LocalDate和LocalTime接口,方法更加实用。
java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。
构造方法私有了,通过内置的now()方法新建
LocalDate date= LocalDate.now(); LocalTime time= LocalTime.now(); LocalDateTime dateTime= LocalDateTime.now(); System.out.println(date); System.out.println(time); System.out.println(dateTime);
//显示如下2019-11-2613:57:57.4402019-11-26T13:57:57.440
常用方法
Date date=newDate(); System.out.println(date);//使用SimpleDateFormat,自定义格式 SimpleDateFormat dateFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format= dateFormat.format(date); System.out.println(format);//转化后是String,将String 转换成Datetry{ Date parse= dateFormat.parse(format);}catch(ParseException e){ e.printStackTrace();}
//显示如下 Tue Nov2615:00:04 CST20192019-11-2615:00:04 Tue Nov2615:00:04 CST2019
//getTime方法将Calendar转换成Date后在格式化 Calendar instance= Calendar.getInstance(); Date date= instance.getTime(); SimpleDateFormat dateFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format= dateFormat.format(date); System.out.println(format);
LocalDate date= LocalDate.now(); LocalTime time= LocalTime.now(); LocalDateTime dateTime= LocalDateTime.now(); System.out.println(date); System.out.println(time); System.out.println(dateTime);//显示如下2019-11-2615:15:23.7222019-11-26T15:15:23.722
格式化
localDate 自带format()方法,需要传参DateTimeFormatter
DateTimeFormatter dateTimeFormatter= DateTimeFormatter.ofPattern("yyyyMMdd"); String format= date.format(dateTimeFormatter); System.out.println(format); DateTimeFormatter dateTimeFormatter2= DateTimeFormatter.ofPattern("HH:mm:ss"); String format2= time.format(dateTimeFormatter2); System.out.println(format2);//显示如下2019112616:08:52
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
//获取时间戳,单位毫秒long l= System.currentTimeMillis(); System.out.println(l);// Date date=newDate();long time= date.getTime(); System.out.println(time);//long timeInMillis= Calendar.getInstance().getTimeInMillis(); System.out.println(timeInMillis);
//Date构造可直接转换 Date date1=newDate(1574758172536L); System.out.println(date1);