LocalDateTime,Date:
没有(无法)包含时区(本地时间,隐式的指默认时区ZoneId.systemDefault)信息,其实就是本地时间,即没有包含时区信息,就像我们平时互相说的时间日期一样,意味着如果需要转换为其他有时区的时间或者转换为其他时区的时候需要传入时区,这里的传入的时区一般就是指ZoneId.systemDefault()系统默认时区,有些函数转换时不需要传,其实是取了默认时区(ZoneId.systemDefault()),点进函数内部可以看到
timestamp,Instant:
时间戳(格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数),本身不包含时区(可以认为隐式包含时区 0 GMT),是一个绝对的时间间隔(离格林威治时间1970年01月01日00时00分00秒过了多久),意味这如果时间戳等于1,你要转换为北京时间(UTC+8),就必须传入时区,结果就是(GMT to UTC+8)8点,而格林威治时间(GMT to GMT)就是0点.
Instant就是java中高精度的时间戳(精确到纳秒数)
这边看看时间戳和Date之间如何转换,或者说Date的底层时间如何保存的,就更清晰了:
Date的构造方法传入时间戳:
Date获得当前时间(本地时间)的秒的方法:
先去获取normalize() 返回 BaseCalendar.Date(也就是标准格式的2019 xx xx这样表示的日期)
看看normalize方法,很多地方都是使用了默认时区去转换我们的日期(对应中国就是在GMT基础上+8(GMT to UTC+8)个小时)
ZonedDateTime,Calendar:
包含时区信息,不传的话会使用默认时区(ZoneId.systemDefault()),时区信息会保存到对象中
其中ZonedDateTime,LocalDateTime,Instant是java8的新时间API,所以推荐使用ZonedDateTime,LocalDateTime,Instant
举个例子:
取当天的0点0分0秒返回Date(本地时间(时区))
/**
* 获得当天零时零分零秒
* @auth hank
* @return 当天零时零分零秒的Date
*/
public static Date getToDayInitial(){
//带着时区(默认时区,本地日期)
ZonedDateTime zonedDateTime = ZonedDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
//1.zonedDateTime.toInstant()转换成时间戳(因为zonedDateTime包含了时区和时间信息,可以转换为GMT的时间戳(时间+时区))2.Date.from会使用默认时区转换时间戳为本地时间(默认时区)
Date date = Date.from(zonedDateTime.toInstant());
return date;
}