简介

在Java 8中又为我们提供了新的日期类。它可以帮我们更精确的保存记录时间。

本文章主要介绍的就是Instant,LocalDate,LocalTime 和 LocalDateTime 这几个类。

UTC

世界标准时间“Coordinated Universal Time”,因为地区的差异,所以有时差。比如:

北京的白天,纽约却是夜晚;

两个人都是8点50出生的,但一个是在法国出生的,一个是在韩国出生的,看上去是一样大,但法国比韩国慢7个小时;

我们想要把两个时间作比较,就需要先转换为世界标准时间再作比较。

协调世界时区会使用“Z”来表示。 北京时间是东八区时间。

Instant的使用

它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用纳秒去表示一个时间则原来使用一位Long类型是不够的,需要占用更多一点的存储空间,实际上其内部是由两个Long字段组成,第一个部分保存的是自标准Java计算时代(就是1970年1月1日开始)到现在的秒数,第二部分保存的是纳秒数(永远不会超过999,999,999)。

我们看下一个具体的例子:

常用方法

now()

获取当前时间

//获得当前时间
Instant instant = Instant.now(); //该方法返回一个记录当前格林威治标准时间的Instant对象的引用。System.out.println(instant);结果为:
2020-07-25T14:31:48.146Z    //精确到了纳秒

toEpochMilli():
获取1970年1月1日至所记录时间的的毫秒数,类似于Date.getTime()。

long l = instant.toEpochMilli();
System.out.println(l);  // 1593222457253

ofEpochMilli(ZoneOffest offest):

将Date对象、日期字符串转换为Instant对象

//将java.util.Date转换为Instant
Instant instant = Instant.ofEpochMilli(new Date().getTime()); //从字符串类型中创建Instant类型的时间
instant = Instant.parse("2020-07-23T11:45:37Z");

atOffset(ZoneOffest offest):
北京时间是东八区时间。因此需要对Instant实例化对象进行偏移量的设置。
通过调用ZoneOffest类的静态方法ofHours(int n),传入一个数值即可设置偏移的小时量。该方法返回一个OffsetDateTime对象的引用。

 // 按时区设置偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 设置偏移量为8System.out.println(offsetDateTime);  结果:
2020-07-27T09:47:37.253+08:00

plus(TemporalAmount amountToAdd) 加时间

instant.plus(Duration.ofHours(2).plusMinutes(3)); //在先在时间的基础上加2小时3分钟
minus(TemporalAmount amountToSubtract) 减时间
//计算5天前的时间instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1instant.minus(Duration.ofDays(5)); // Option 2  方法2

//计算两个Instant之间的分钟数

long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2

Duration

字面意思是持续时间,表示一天时间,一小时,一分钟。

//设置指定单位的持续时间
Duration durationDays = Duration.ofDays(1);//天
Duration durationHours = Duration.ofHours(1);//小时
Duration durationMinutes = Duration.ofMinutes(1);//分
Duration durationSeconds = Duration.ofSeconds(1);//秒
Duration durationMillis = Duration.ofMillis(1);//毫秒 //将设置的单位时间转换成小时,分钟,秒,纳秒
Duration duration = Duration.ofDays(1);//设置一天时间
long timeHours = duration.toHours();//小时       24
long timeMinutes = duration.toMinutes();//分钟   1440
long timeMillis = duration.toMillis();//毫秒     86400000
long timeNanos = duration.toNanos();//纳秒       86400000000000
String timeString = duration.toString(); //此持续时间的字符串表示形式,使用基于ISO-8601秒*的表示形式,例如 PT8H6M12.345S//求两个日期差值
Duration duration = Duration.between(start, end);

LocalDate和LocalTime

LocalDate 表示不带时区的日期,比如 1-1-2000。LocalTime 表示不带时区的时间,比如 04:44:50.12,和之前提到的 Instant 类是从1970年计算偏移量不同,这两个类的输出是人们习惯阅读的日期和时间。有很多种方法去获得 LocalTime 和 LocalDate 的实例,如:

LocalDate localDate = LocalDate.now();
localDate = LocalDate.ofYearDay(2005, 86); // 获得2005年的第86天 (27-Mar-2005)
localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013年8月10日
LocalTime localTime = LocalTime.of(22, 33); //10:33 PM
localTime = LocalTime.now();
localTime = LocalTime.ofSecondOfDay(4503); // 返回一天中的第4503秒 (1:15:30 AM)

LocalDate 和 LocalTime 和 Instant 一样遵守同样的线程规定―― 如它们的实例子都是不可变的。LocalDate 和 LocalTime 和 Instant 有同样的计算和比较方法(其中有些方法是在 java.time.temporal.Temporal接口中定义的,并且上面这些类都实现了这些方法):

LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS);
localDate.isBefore(localDate1);

LocalDateTime

它是LocalDate和LocalTime的组合体,表示的是不带时区的 日期及时间。

LocalDateTime localDateTime = LocalDateTime.now();
//当前时间加上25小时3分钟
LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3);
// 同样也可以用在localTime和localDate中
System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3));
System.out.println(localDateTime.toLocalDate().plusMonths(2));
// 也可以使用实现TemportalAmount接口的Duration类和Period类
System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3)));
System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2)));

Instant 和 LocalDateTime的区别

Instant :

表示来自时代的偏移量(01-01-1970),表示时间线上的某个瞬间。

同一时刻在地球上的两个不同地方创建的物体将具有完全相同的价值。

LocalDateTime:

LocalDateTime是一个不可变的日期时间对象。 如2020-07-23T11:21:30

如果没有附加信息(如偏移或时区),它不能代表时间线上的瞬间。

字符串与LocalDateTime、LocalDate、Instant、Date之间相互转换

//设置时区偏移量 中国就是8个小时public static final ZoneOffset ZONE_CHINA = ZoneOffset.ofHours(8);//T代表可替换的任意字符,SSS指的是毫秒,Z代表的时区。--"2020/12/18T10:00:51.268+0800"public static final DateTimeFormatter FORMATTE_Z = DateTimeFormatter.ofPattern("yyyy/MM/dd'T'HH:mm:ss.SSSZ");//没有时区 --"2020-12-18T10:00:51.268"public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");public static final DateTimeFormatter FORMATTER2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss.SSS");//设置时区public static final DateTimeFormatter FORMATTER_CHINA = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).withLocale(Locale.CHINA );public static void main(String[] args) {//字符串转LocalDateTime//转换的格式一定是匹配的,否则会报错//默认的转换格式  yyyy-MM-dd'T'HH:mm:ss.SSSString str1 = "2020-12-18T10:00:51.268";LocalDateTime parse1 = LocalDateTime.parse(str1);System.out.println(parse1);//2020-12-18T10:00:51.268//自定义格式转换String str2 = "2020/12/18T10:00:51.268+0800";LocalDateTime parse2 = LocalDateTime.parse(str2, FORMATTE_Z);System.out.println(parse2);//2020-12-18T10:00:51.268String str3 = "2020-12-18 10:00:51.268";LocalDateTime parse3 = LocalDateTime.parse(str3, FORMATTER);System.out.println(parse3);//2020-12-18T10:00:51.268//LocalDateTime转字符串String format = parse1.format(DateTimeFormatter.ofPattern("yyyy=MM==dd HH+mm+ss.SSS"));System.out.println(format);//字符串转LocalDateString str4 = "2020-12-18";LocalDate parse4 = LocalDate.parse(str4);String str5 = "2020/12/18";LocalDate parse5 = LocalDate.parse(str5, DateTimeFormatter.ofPattern("yyyy/MM/dd"));System.out.println(parse4);//2020-12-18System.out.println(parse5);//2020-12-18String format2 = parse4.format(DateTimeFormatter.ofPattern("yyyy=MM==dd"));System.out.println(format2);//字符串转InstantString str6 = "2007-12-03T10:15:30.145Z";Instant parse6 = Instant.parse(str6);System.out.println(parse6);String format1 = FORMATTER_CHINA.format(parse6);System.out.println(format1);//2007-12-03T10:15:30.145Z//Instant转LocalDateTime                        Instant实例   时区偏移量LocalDateTime dateTime = LocalDateTime.ofInstant(parse6, ZONE_CHINA);//Instant转LocalDateLocalDate date = LocalDate.ofInstant(parse6,ZONE_CHINA);//LocalDateTime转LocalDateLocalDate localDate = dateTime.toLocalDate();//Date//public static Date from(Instant instant)//public Instant toInstant()//Instant转InstantDate from = Date.from(parse6);System.out.println(from);//LocalDateTime和LocalDate可以先转换成Instant,再转换成Date对象//Date对象可以先转换成Instant在转换到其他时间对象}

JDK8 Instant类的使用和LocalDate,LocalTime 和 LocalDateTime的介绍。相关推荐

  1. linux localtime 线程安全,LocalDate、LocalTime、LocalDateTime常用方法介绍(线程安全)...

    一.JDK Release Notes: https://www.oracle.com/technetwork/java/javase/jdk-relnotes-index-2162236.html? ...

  2. 关于LocalDate、LocalTime、LocalDateTime

    0.快速上手 看源码: https://www.matools.com/api/java8 在java.time中 //获取当前时间 LocalDateTime localDateTime = Loc ...

  3. Dete类,Calendar类,Clock类,Instant类,Localtime类,Duration类,LocalDate类,Period类的特性(1)

    一.各类的优缺点 1. Date类 优点:简单易用,可以进行基本的日期和时间计算. 缺点:已经过时,精度只能到毫秒级别,不支持时区设置. 2. Calendar类 优点:可以进行日期和时间的计算,支持 ...

  4. Java中 LocalDate、LocalTime、LocalDateTime三个时间工具类的使用介绍

    Java中 LocalDate.LocalTime.LocalDateTime三个时间工具类的使用介绍 一.背景: 之前在做项目的过程中,对日期时间类没有一个系统的了解,总是在用的时候去搜索一下,解决 ...

  5. Java关于LocalDate、LocalTime、LocalDateTime类的详细讲解

    Java关于日期和时间相关API必须明白的方法和类(JDK8之后部分) 文章目录 Java关于日期和时间相关API必须明白的方法和类(JDK8之后部分) 新日期时间API出现的背景 新时间日期API ...

  6. JAVA时间类型:Date、Calendar、LocalDate 、LocalTime、LocalDateTime、Instant的使用

    本文介绍JAVA的几种时间类型的使用:Date.Calendar.LocalDate .LocalTime.LocalDateTime.Instant Date #获取当前时间 Date date = ...

  7. java localdate_Java 时间类-Calendar、Date、LocalDate/LocalTime

    1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...

  8. JDK8新特性LocalDate、LocalTime和LocalDateTime

    LocalDate.LocalTime和LocalDateTime这三个类是JDK1.8出来的新特性,用于时间和日期的支持,这三个类位于java.time包下面. LocalDate: LocalDa ...

  9. LocalDate、LocalTime、LocalDateTime介绍

    一.Date与LocalDate.LocalTime.LocalDateTime互转 1.Date转LocalDate.LocalTime.LocalDateTime Date date = new ...

最新文章

  1. $.ajax的type属性,$.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
  2. 公共闪存接口CFI在Flash Memory程序设计中的应用
  3. windows8.1下安装Cygwin并通过apt-cyg安装软件包
  4. error C2220: 警告被视为错误 - 没有生成“object”文件
  5. 暴风集团:冯鑫因涉嫌对非国家工作人员行贿被公安机关拘留
  6. LNMP源码安装教程
  7. 【C++】指针遍历二维数组若干种方法小结
  8. Python访问MySQL数据库速度慢解决方法
  9. 局域网查询在线计算机ip地址,教你利用局域网快速查询电脑IP地址的详细步骤...
  10. VUP无法打开报0xc0150002错误
  11. android 简书代码截图工具,Android 截屏
  12. 网络打印机 这台计算机上没有安装,Win7添加网络打印机时提示打印处理器不存在怎么办?...
  13. jqury ajax 标准
  14. 微信视频号视频怎么下载?
  15. latex中插入图片以及固定图片位置
  16. java恒大集团面试经验,教你如何通过万科恒大面试 顺利拿到一流房企offer
  17. 【Vue项目实战】vue.js2.5 饿了么APP(1)概述+项目准备
  18. 来来来,教你如何智慧薅羊毛!
  19. oracle 口令修改,Oracle更改口令
  20. FCRP-D---帆软官网模拟题,tomcat模块

热门文章

  1. 移动端APP测试总结--转
  2. b站电脑测试用什么软件,使用BiliBili访问诊断工具检测哔哩哔哩网络的方法
  3. elasticSearch-优化篇
  4. vue 如何获取图片的原图尺寸_js获取图片信息(一)-----获取图片的原始尺寸
  5. 【初级C语言】代码版式(空行,空格,对齐,长行代码,注释)
  6. MBA书籍推荐:打造商业思维,看这一本书就够了
  7. Ubuntu16.04安装MySQL笔记
  8. Vivo升级android版本,vivo手机升级Android Q教程:很简单,X27与NEX都支持
  9. phpmywind 常用函数 整理中……
  10. Ubuntu16.04 开机开启小键盘数字键,时默认开NumLock灯