第九章 Java常用类
9.2 JDK 8之前的日期时间API
9.2.1 java.lang.System类的使用
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,此方法适用于计算时间差。
计算世界时间的主要标准有:UTC(Universal Time Coordinated);
GMT(Greenwich Mean Time);CST(China Standard Time)
public class TimeTest {
public static void main(String[] args) {
long l = System.currentTimeMillis();
long l1 = 1970 + l / 3600000 / 24 / 365;
System.out.println("现在是:"+l1+"年");
}
}
9.2.2 java.util.Date类与 java.sql.Date类的使用
java.util.Date类:表示特定的瞬间,精确到毫秒
①.两个构造器的使用:
构造器一:Date():创建一个对应当前时间的Date对象
构造器二:Date(long date):创建指定毫秒数的Date对象
②.两个方法的使用:
toString():显示当前的年,月,日,时,分,秒
getTime():获取当前Date对象对应的毫秒数(时间戳)。
③. java.sql.Date对应着数据库中的日期类型的变量
import java.util.Date;
public class TimeTest {
public static void main(String[] args) {
//构造器一:Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());// Tue Nov 23 09:45:15 CST 2021
System.out.println(date1.getTime());//1637632052346
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(1637632052346l);
System.out.println(date2.toString());//Tue Nov 23 09:47:32 CST 2021
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(1637632052346l);
System.out.println(date3);//2021-11-23
//如何将一个java.util.Date对象转换为java.sql.Date对象
Date date4 = new java.sql.Date(1637632052346l);
System.out.println(date4);//2021-11-23
java.sql.Date date5 = (java.sql.Date) date4;
System.out.println(date5);//2021-11-23
}
}
9.2.3 java.text.SimpleDateFormat类
Date类的API不易于国际化,大部分都被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来解决的方式来格式化和解析日期的具体类。
它允许进行格式化:日期 → 文本,解析:文本 → 日期
格式化方法:
SimpleDateFormat():默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:
public String format(Date date):方法格式化时间对象date;
解析:
public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeTest {
public static void main(String[] args) throws Exception {
//实例化SimpleDateFormat:使用默认的构造器
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
//格式化:日期 → 字符串
Date data = new Date();
System.out.println(data);//Tue Nov 23 10:32:56 CST 2021
String format = simpleDateFormat.format(data);
System.out.println(format);//2021/11/23 上午10:33
//解析:格式化的逆过程 文本 → 日期
String str = "2021/11/23 上午10:33";
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);//Tue Nov 23 10:33:00 CST 2021
//按照指定的格式格式化和解析,调用带参的构造器
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd hh:mm");
//格式化
System.out.println(simpleDateFormat1.format(new Date()));//2021-11-23 10:42
//解析
System.out.println(simpleDateFormat1.parse("2021-11-23 10:42"));//Tue Nov 23 10:42:00 CST 2021
}
}
9.2.4 java.util.Calendar(日历)类
Calendar是一个抽象基类,主要用于完成日期字段之间相互操作的功能。
获取Calendar实例的方法
使用Calendar.getInstance()方法;调用GregorianCalendar的构造器。
一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的事件信息。比如YEAR,MONTH,DAY_OF_WEEK,HOUR_OF_DAYMINUTE,SECOND
public void set(int field,int value)
public void add(int field,int amount)
public final Date getTime()
public final void setTime(Date date)
注意:获取月份时,一月是0,二月是1,以此类推,12月是11;获取星期时同上。
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class TimeTest {
public static void main(String[] args) {
//1.实例化
//方式一:创建其子类GregorianCalendar的对象
Calendar calendar1 = new GregorianCalendar();
System.out.println(calendar1);
//方式二:调用其静态方法getInstance()
Calendar calendar2 = Calendar.getInstance();
System.out.println(calendar2);
//2.常用方法
//get()方法
System.out.println("今天是今年的第"+calendar1.get(Calendar.DAY_OF_YEAR)+"天");
System.out.println("今天是"+(calendar1.get(Calendar.MONTH)+1)+"月的第"+calendar2.get(Calendar.DAY_OF_MONTH)+"天");
/*//set()方法
calendar1.set(Calendar.DAY_OF_MONTH,25);
int i = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(i);
//add()方法
calendar1.add(Calendar.DAY_OF_MONTH,5);
int j = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(j);*/
//getTime():日历类 → Data
Date data1 = calendar1.getTime();
System.out.println(data1); //Tue Nov 23 11:18:56 CST 2021
//setTime(): Data → 日历类
Date date2 = new Date();
calendar1.setTime(date2);
System.out.println(calendar1.get(Calendar.DAY_OF_MONTH));
}
}
9.3 JDK 8中新日期时间API
9.3.1 新时间日期中API的介绍
java.time - 包含值对象的基础包
java.time.chrono - 提供对不同的日历系统的访问
java.time.format - 格式化和解析时间和日期
java.time.temporal - 包括底层框架和扩展特性
java.time.zone - 包含时区支持的类
9.3.2 LocalDate、LocalTime、LocalDateTime 的使用
LocalDate,LocalTime,LocalDateTime 类是其中较为重要的几个类,它们的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期,时间,日期和时间。他们提供了简单的本地日期或时间,并不包含当前的时间信息和与时区相关的信息。
LocalDate代表IOS格式(yyyy-MM-dd)日期,可以存储生日,纪念日等日期。
LocalTime表示一个时间,而不是日期。
LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class TimeTest {
public static void main(String[] args) {
//1.LocalDateTime.now() 获取的当前日期和时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);//2021-11-23T11:43:59.373932200
//2.LocalDate.now() 获取的当前日期
LocalDate localDate = LocalDate.now();
System.out.println(localDate);//2021-11-23
//3.LocalTime.now() 获取的当前时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime);//11:46:11.736041800
//4.LocalDateTime.of() 指定时间
LocalDateTime localDateTime1 = LocalDateTime.of(2012,12,12,12,12,12,12);
System.out.println(localDateTime1);//2012-12-12T12:12:12.000000012
//5.getXxx() 获取指定格式时间
System.out.println(localDateTime.getYear());//2021
System.out.println(localDateTime.getMonth());//NOVEMBER
System.out.println(localDateTime.getDayOfYear());//327
System.out.println(localDateTime.getDayOfMonth());//23
System.out.println(localDateTime.getDayOfWeek());//TUESDAY
System.out.println(localDateTime.getHour());//14
System.out.println(localDateTime.getMinute());//31
System.out.println(localDateTime.getSecond());//33
//6.withXxx()设置相关属性 体现不可变性
LocalDateTime localDateTime2 = localDateTime.withHour(17);
System.out.println(localDateTime);//2021-11-23T14:31:33.907819300
System.out.println(localDateTime2);//2021-11-23T17:31:33.907819300
//7.plusXxx()时间属性增加 minusXxx()时间属性减少
LocalDateTime localDateTime3 = localDateTime.minusMonths(3);
System.out.println(localDateTime);//2021-11-23T14:31:33.907819300
System.out.println(localDateTime3);//2021-08-23T14:35:47.305078900
}
}
9.3.3 瞬时:Instant类的使用
Instant:时间线上的一个瞬间点。这可能被用来记录应用程序中的事件时间戳。java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念来讲,它只是简单的表示来自1970年1月1日0时0分0秒(UTC)开始的毫秒数。因为java.time包是基于那庙计算的,所以Instant的精度可以达到纳秒级。
(1秒 = 1000毫秒 = 10的6次方微秒 = 10的九次方纳秒)
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class TimeTest {
public static void main(String[] args) {
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);//英国时间:2021-11-23T06:51:37.809839900Z
//添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//北京时间:2021-11-23T14:55:45.131766100+08:00
//toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
System.out.println(instant.toEpochMilli());//1637650662789毫秒
//ofEpochMilli()通过给定毫秒数,获取Instant实例
Instant instant1 = Instant.ofEpochMilli(1637650928625l);
System.out.println(instant1.atOffset(ZoneOffset.ofHours(8)));//2021-11-23T15:02:08.625+08:00
}
}
9.3.4 格式化与解析日期或时间
java.time.format.DateTimeFormatter类:该类提供了三种格式化方法:
①.预定义的标准格式。
②.本地化相关的格式。
③.自定义的格式。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
public class TimeTest {
public static void main(String[] args) {
//1.预定义的标准格式
LocalDateTime localDateTime1 = LocalDateTime.now();
DateTimeFormatter formatter1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String format1 = localDateTime1.format(formatter1);
System.out.println(format1);//2021-11-23T15:31:15.7245631
//2.本地化相关的格式
LocalDateTime localDateTime2 = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String format2 = localDateTime1.format(formatter2);
System.out.println(format2);//2021/11/23 下午3:31
//3.自定义的格式
LocalDateTime localDateTime3 = LocalDateTime.now();
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format3 = localDateTime3.format(formatter3);
System.out.println(format3);//2021-11-23 03:31:15
}
}
9.3.5 其他API
Zoneld:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:10 Europe/Paris,其中每个时区都对应这ID,地区ID都为“{区域}/{城市}”的格式,例如Asia/Shanghai等
Clock:使用时区提供对当前即时,日期和时间的访问的时钟。
持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔
TemporalAdjuster:时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。
TemporalAdjusters:该类通过静态方法(firstDayOfXxx()/lastDayOfXxx
()/nextXxx())提供了大量的常用TemporalAdjuster的实现
9.3.6 与传统日期处理的转换