【Java】jdk 8.0 中的时间日期API
1.日期时间API的迭代
- jdk 1.0 Date类
- jdk 1.1 Calender类,一定程度上替换Date类。
- jdk 1.8 一套新的API
2.前两代存在的问题
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date管用,Calendar则不行。
- 线程安全:它们都不是线程安全的,不能处理润秒等。
3.java 8中新的日期时间API涉及到的包
加粗的为常用的。
包名 | 描述 |
---|---|
java.time | 包含值对象的基础包 |
java.time.chrono | 提供对不同的日历系统的访问 |
java.time.format | 格式化和解析时间、日期 |
java.time.temporal | 包括底层框架和扩展特性 |
java.time.zone | 包含时区支持的类 |
4.LocalDate、LocalTime、LocalDateTime
(1)说明
① 分别表示使用ISO-8601日历系统的日期、时间、日期和时间。提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关信息。
② LocalDateTime使用频率较高。
③ 类似于Calendar。
④ 构造器是私有的。
private LocalDateTime(LocalDate date, LocalTime time) {
this.date = date;
this.time = time;
}
(2)常用方法
方法名 | 描述 |
---|---|
now()、now(zoneId zone) | 静态方法,根据当前时间创建对象/指定时区的对象 |
of() | 静态方法,根据指定日期/时间创建对象 |
getDayofMonth()、getDayOfYear() | 获得月份天数(1-31)、获得年份天数(1-366) |
getDayOfWeek() | 获取星期几(返回一个DayOfWeek枚举值) |
getMonth() | 获得月份,返回一个Month枚举值 |
getMonthValue()、getYear() | 获得月份(1-12)、获得年份 |
getHour()、getMinute()、getSecond() | 获得当前对象对应的小时、分钟、秒 |
withDayOfMonth()、withDayOfYear()、withMonth()、withYear() | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 |
plusDays()、plusWeeks()、plusMonths()、plusYears()、plusHours() | 向当前对象添加几天、几周、几个月、几天、几小时 |
minusMonths()、minusWeeks()、minusDays()、minusYears()、minusHours() | 从当前对象减去几月、几周、几天、几年、几小时 |
5.Instant类
表示时间线上的一个瞬时点。表示自1970年1月1日0时0分0秒(UTC时区开始的秒数),类似于java.util.Date类。
(1)常用方法
方法 | 描述 |
---|---|
now() | 静态方法,返回默认UTC时区的Instant类的对象 |
ofEpochMilli(long epochMilli) | 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象 |
atOffset(ZoneOffset offset) | 结合即时的偏移来创建一个OffsetDateTime |
toEpochMilli() | 返回1970-01-01 00:00:00到当前时间的毫秒数(时间戳) |
时间戳:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
6.日期时间格式化类DateTimeFormatter
- 格式化或解析日期、时间
- 类似于SimpleDateFormat
(1)实例化方式
- 预定义的标准格式:
ISO_LOCAL_DATE_TIME
、ISO_LOCAL_DATE
、ISO_LOCAL_TIME
- 本地化相关格式:
FormatStyle.FULL
、FormatStyle.LONG
、FormatStyle.MEDIUM
、FormatStyle.SHORT
- 自定义格式:
ofPattern("yyyy-MM-dd hh:mm:ss")
//方式一
DateTimeFormatter dtf1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//方式二
DateTimeFormatter dtf2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//方式三
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
(2)常用方法
方法 | 描述 |
---|---|
ofPattern(String pattern) | 静态方法,返回一个指定字符串格式的DateTimeFormatter |
format(TemporalAccessor t) | 格式化一个日期、时间,返回字符串 |
parse(CharSequence text) | 将指定格式的字符序列解析为一个日期、时间 |
//实例化对象:自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化:日期时间-->字符串
String str4 = formatter.format(LocalDateTime.now());
System.out.println(str4); //2022-12-06 02:57:01
//解析:字符串-->日期时间
TemporalAccessor accessor = formatter.parse("2019-02-18 03:52:09");
System.out.println(accessor);