Java时间API
1. JDK8之前的时间API
1.1 System.currentTimeMillis()
返回的是1970年0时0分到现在的毫秒数(long类型的数据),又称为时间戳
这个方法适用于计算时间差
@Test
public void test1(){
//返回的是1970年0时0分到现在的毫秒数,称为时间戳
long time = System.currentTimeMillis();
System.out.println(time);
}
1.2 Date类
有2个Data类,java.util.Date类和java.sql.Date类
java.util.Date类是java.sql.Date类的父类
java.util.Date类
- 2个构造器
- 空参构造器:Date date1 = new Date();创建了一个对应当前时间的Date对象
- 带参构造器:Date date2 = new Date(12355353242L);创建指定毫秒数的Date对象
- 两个常用方法
- toString():显示当前的年月日、时分秒
- getTime():返回long类型的时间戳(和System.currentTimeMillis()的效果是一样的)
java.sql.Date类
java.sql.Date类对应数据库中的日期类型的变量
java.sql.Date date = new java.sql.Date(1233332223242L);
System.out.println(date); //2009-01-31
- 如何将java.sql.Date的对象转化为java.util.Date的对象?
多态,直接赋值即可。因为java.sql.Date是子类 - 如何将java.util.Date的对象转化为java.sql.Date的对象?
Date date = new Date(); java.sql.Date date2 = new java.sql.Date(date.getTime());
1.3 java.text.SimpleDateFormat类
- 格式化
格式化:将日期转化为字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
String str = sdf.format(date);
System.out.println(str); //默认格式是这样的:2023/1/5 上午11:15
- 解析
解析:将字符串转化为日期,解析的字符串要按照SimpleDateFormat对象格式化的格式来才可以解析,否则会抛异常(格式通过构造器来体现)
//解析:将字符串转化为日期
String str = "2022/12/1 上午11:15";
Date date2 = sdf.parse(str);
System.out.println(str);
System.out.println(date2);
调用带参数的构造器指定日期格式:
上面构造SimpleDateFormat的对象是空参构造器,适用的日期格式是默认的,实际使用中我们可以指定日期的格式
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = sdf.format(date);
System.out.println(str); //2023-01-05 11:28:12
Date date2 = sdf.parse("2023-01-05 11:28:12");
1.4 java.util.Calendar类
Calender是一个抽象类
实例化的2种方式
- 方式一:调用静态方法getInstance()
- 方式二:创建子类GregorianCalendar的对象
通常采用第一种方式Calendar = getInstance()
Calendar calendar = Calendar.getInstance();
常用方法
-
get()
获取当前日期是月份中的第几天,一年中的第几天System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
-
void set()
因为set方法没有返回值(void),所以是将当前日期本身进行修改calendar.set(2022,12,20); System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
-
void add()
针对对象的指定属性进行加法(负数表示减法)运算//在当前日期的基础上,减去3天 calendar.add(Calendar.DAY_OF_MONTH,-3);
-
Date getTime()
将Calendar类转化为Date类Date date = calendar.getTime(); System.out.println(date);
-
setTime(Date date)
将Date类转化为Calendar类calendar.setTime(date);
注意:
- 获取月份时:一月是0,二月是1,以此类推,12月是11
- 获取星期时:周日是1,周二是2 ··· 周六是7
JDK8之前的时间API有诸多的缺陷,所以在JDK8引入了新的时间API
为什么要引入新的时间API ?
2. JDK8新引入的时间API
2.1 LocalDate,LocalTime,LocalDateTime
LocalDateTime类使用的频率大于LocalDate,LocalTime
1. now()
now()是一个静态方法(static),可以获取当前的时间
@Test
public void test1(){
//now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);//2023-01-05
System.out.println(localTime);//17:09:44.866713100
System.out.println(localDateTime);//2023-01-05T17:09:44.866713100
}
2. of()
使用静态方法of()指定年月日,时分秒(没有偏移量)
//LocalDate和LocalTime同理
LocalDateTime localDateTime1 = LocalDateTime.of(2022,12,10,8,0,0);
System.out.println(localDateTime1);//2022-12-10T08:00
3. getXxx()
- getDayOfMonth(): 得到月份天数(1-31)
- getDayOfYear(): 得到年份天数(1-366)
- getDayOfWeek(): 得到星期几(枚举值)
- getMonth(): 得到月份Month的枚举值(FEBURARY)
- getMonthValue(): 得到月份的数值
- getYear(): 得到年份的数值
- getHour()/getMinute():getSecond():得到时分秒
4.withXxx()
- withDayOfMonth()/withDayOfYear()/withMonth()/withYear()
将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
5.plusXxx()/minusXxx()
- plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()
向当前对象添加几天、几周、几个月、几年、几小时,返回新的对象 - minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()
从当前对象减去几月、几周、几天、几年、几小时,返回新的对象
注意:
- 返回新的对象,体现出的是不可变性,和String的不可变性类似
- 而Calendar中的时间是对原有的对象进行修改,不具有不可变性
2.2 Instant类
@Test
public void test2(){
//得到的是本初子午线的标准时间
Instant instant = Instant.now();
System.out.println(instant);//2023-01-05T12:00:08.517341300Z
//中国处在东八区,需要在此基础上加上8个小时
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2023-01-05T20:00:08.517341300+08:00
//获取1970年0时0分到现在的毫秒数
System.out.println(instant.toEpochMilli());
Instant instant1 = Instant.ofEpochMilli(1672920215586L);
System.out.println(instant1);
}
2.3 DateTimeFormatter类
用于格式化与解析日期或时间,类似于SimpleDateFormat类
- 实例化
- 方式1:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
- 方式2:本地化相关的格式,如:ofLocalizedDateTime(FormatStyle.LONG),还可以选择FormatStyle.MEDIUM,FormatStyle.SHORT,FormatStyle.FULL等作为参数
- 方式3:自定义的格式,如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
实际使用中主要使用自定义的格式
-
格式化(format)
将日期转化为字符串 -
解析(parse)
将字符串转化为日期
// 方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2019-02-18T15:42:18.797
//解析:字符串 -->日期
TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
System.out.println(parse);
// 方式二:
// 本地化相关的格式。如:ofLocalizedDateTime()
// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2019年2月18日 下午03时47分16秒
// 本地化相关的格式。如:ofLocalizedDate()
// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);//2019-2-18
// 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);