Instant、Duration
- Instant和Duration都是不可修改的类,一些增加、减少方法返回的都是新的实例
- Instant表示当前时刻,相对于1970年1月1日午夜。
- Duration表示两个时刻之间的时间量
- long值可以存储大约300年时间对应的纳秒数,如果Duration大于这个时间,获取纳秒数会发生上溢
本地日期LocalDate
日期调整器TemporalAdjusters
本地时间LocalTime
本地日期时间LocalDateTime
时区时间
- 代表的是一个具体的时刻Instant
格式化和解析DateTimeFormatter
三种格式器
-
预定义的格式器
-
locale相关的格式器
-
自定义模式格式器
解析字符串中的日期、时间值
java.util.date
- Date的源码,可以发现它实际上存储了一个long类型的以毫秒表示的时间戳
- Date对象有几个严重的问题:它不能转换时区,除了toGMTString()可以按GMT+0:00输出外,Date总是以当前计算机系统的默认时区为基础进行输出。此外,我们也很难对日期和时间进行加减,计算两个日期相差多少天,计算某个月第一个星期一的日期等。
- getYear()返回的年份必须加上1900,getMonth()返回的月份是011分别表示112月,所以要加1,而getDate()返回的日期范围是1~31,又不能加1。
java.util.calendar
相对于Date多了简单的日期加减计算
- 注意到Calendar获取年月日这些信息变成了get(int field),返回的年份不必转换,返回的月份仍然要加1,返回的星期要特别注意,1~7分别表示周日,周一,……,周六。
- Calendar只有一种方式获取,即Calendar.getInstance(),而且一获取到就是当前时间。如果我们想给它设置成特定的一个日期和时间,就必须先清除所有字段
- 利用Calendar.getTime()可以将一个Calendar对象转换成Date对象,然后就可以用SimpleDateFormat进行格式化了。
Java.util.timeZone
- Calendar和Date相比,它提供了时区转换的功能。时区用TimeZone对象表示:
- 时区的唯一标识是以字符串表示的ID,我们获取指定TimeZone对象也是以这个ID为参数获取,GMT+09:00、Asia/Shanghai都是有效的时区ID。要列出系统支持的所有ID,请使用TimeZone.getAvailableIDs()。
利用Calendar进行时区转换的步骤是:
- 清除所有字段;
- 设定指定时区;
- 设定日期和时间;
- 创建SimpleDateFormat并设定目标时区;
- 格式化获取的Date对象(注意Date对象无时区信息,时区信息存储在SimpleDateFormat中)。
- 因此,本质上时区转换只能通过SimpleDateFormat在显示的时候完成。
public class Main {
public static void main(String[] args) {
// 当前时间:
Calendar c = Calendar.getInstance();
// 清除所有:
c.clear();
// 设置为北京时区:
c.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
// 设置年月日时分秒:
c.set(2019, 10 /* 11月 */, 20, 8, 15, 0);
// 显示时间:
var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(c.getTime()));
// 2019-11-19 19:15:00
}
}
计算机表示的时间是以整数表示的时间戳存储的,即Epoch Time,Java使用long型来表示以毫秒为单位的时间戳,通过System.currentTimeMillis()获取当前时间戳。