由于jdk8以前的时间日期类设计的不足,jdk8引入了java.time包来作为新的日期时间处理类。以前的Date类,Calendar类都可以被新的api取代,新的api的大多数类都是线程安全的,加减时间返回的都是一个新的实体,不会改变原来对象的属性。
了解jdk8的时间类之前,先了解下时间的基本知识。
关于时间的相关名词 | 含义 |
---|---|
GMT | Greenwich Mean Time 格林尼治标准时间,十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度,并以地球由西向东每24小时自转一周360°,订定每隔经度15°,时差1小时。而每15°的经线则称为该时区的中央经线,将全球划分为24个时区,其中包含23个整时区及180°经线左右两侧的2个半时区,东区的时间要早于西区,例如北京是东八区,东京在东九区,北京现在是下午14:00,那东京就是下午15:00 |
UTC | Coordinated Universal Time 世界协调时间,比GMT更加精准,但功能和精度基本差不多 |
ISO | ISO 8601是日期和时间的表示方法,即用字母和符号表示日期和时间 |
时间戳 | 从1970-01-01 00:00:00与现在所差的秒数,这里的差值表示的伦敦时间的差值,换算到本地时,会加上本地的偏移量的秒数。 |
保存纪元时间的秒数和毫微秒,可以通过获取毫秒数和Date互相转换
Instant instant = Instant.now();
Date date = new Date(instant.toEpochMilli());
2.2 LocalDateTime
只记录了日期和时间,没有存贮时区信息,如果只想获取日期可以使用LocalDate,只想获取时间可以指定LocalTime
所以LocalDateTime转Instant要指定ZoneOffset(偏移量),同时提供了加减日期和时间的相关方法
LocalDateTime dateTime = LocalDateTime.now();
2.3 ZoneId/ZoneOffSet
ZoneId/ZoneOffSet的区别。
ZoneOffSet只处理与标准时的时区差,ZoneId除了处理与标准时的时间差,还处理地区时(夏令时,冬令时等时间调整)
支持传统的多种方式创建时区实例
ZoneId.of("Asia/Shanghai");
ZoneId.of("+08:00");
ZoneOffset.of("+08:00");
2.4 ZoneDateTime
保存了时区的信息的日期和时间类,由于保存了时区信息,所以转换成Instant不需要提供时区偏移类。
Instant instant = ZonedDateTime.now().toInstant();
2.5 日期时间格式化类 DateTimeFormatter
DateTimeFormatter类功能和SimpleDateFormat功能类似,不过DateTimeFormatter是线程安全的。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime parseDateTime = LocalDateTime.parse("2019-01-01 00:00:00",formatter);
System.out.println(parseDateTime);
2.6 Period,Duration 日期时间比较类
Period可以比较日期,Duration可以比较时间
3.总结jdk的版本迭代还是挺快的,在升级jdk版本之后,原先一些不再被推荐使用的api,不应该继续在新的项目和代码中继续使用。