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

一、背景:

之前在做项目的过程中,对日期时间类没有一个系统的了解,总是在用的时候去搜索一下,解决问题即完事,久而久之,导致对这个概念特别模糊。直到近期,做项目的过程中使用了mybatis-plus框架,这个框架自动生成映射文件的工具会将MySQL中的datetime类型转化成Java中的LocalDateTime类型,由于几次都出现了转化错误、转化繁琐的问题,因此,就打算详细的了解一下Java中的时间类的相关知识,希望下次再使用能够做到心中有底。经过了几天的了解,对这个时间概念算是有了一个大致的了解,记录下来供以后参考。看来解决问题还得要抓住问题的本质,了解技术的来龙去脉,不能浮于表面。(更好的阅读体验,请移步我的个人博客)

二、介绍:

在JDK8发布的时候,推出了LocalDate、LocalTime、LocalDateTime这个三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作。在Java8之前,处理日期时间的类是Date、Calendar,这两个在使用起来总是让人感觉不是很舒服,在设计上面有一些缺陷,并且还不是线程安全的。

想要详细的了解这几个类,我们得要了解一点关于时间、时区划分的一些知识。1884 年, 国际经度会议将地球表面按经线等分为24 区,称为时区。即以本初子午线为基准, 东西经度各7.5 度的范围作为零时区, 然后每隔15度为一时区,每个时区相差一小时。北京时区为东八区,要比零时区早8个小时。如果现在零时区的时间是10点的话,那北京时间就是18点。

我们平时在程序里面所见到的UTC时间,就是零时区的时间,它的全称是Coordinated Universal Time ,即世界协调时间。另一个常见的缩写是GMT,即格林威治标准时间,格林威治位于 零时区,因此,我们平时说的UTC时间和GMT时间在数值上面都是一样的。

可能会有一些疑问,同样是在地球上啊,不同的地区时间怎么还不一样了?难道我现在从北京乘个飞机飞到格林威治,还可以来个时光倒流?如果这样,岂不很神奇?哈哈,当然事情的真相并不是这样的。时间的流逝、细胞的衰老对于整个地球来说都是一样的,因此,不管你在地球的哪里,这一秒过去了,就是过去了,它最为公平,不会多你一分,也不会少你一秒。那怎么记录这流逝的分分秒秒呢?有一个名词,叫做时间戳,它是指格林威治(地球零时区)时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,这个时间戳,在地球的各个地方都是一致的。在1970年以前,有其他的计时方式,由于没有统一,还造成了一些软件的运行在时间上的错乱,险些酿成了的行业灾难(具体的事件可以网上搜索)。如果单纯指望这个时间戳作为人们的计时标准,那也是不现实的,因为这对人类的生产生活来说没有任何的意义。举个例子:每天早上八点上课(上班)符合我们的习惯,如果是***秒到了上课时间就有违人的正常脑回路了。这时候,根据地球上的不同经纬度、地球自转的特点,就划分了时区,时间戳根据不同的时区转化成当地的时间,以此作为作息标准,从而方便人们的生产生活。北京时间的8点我们可以见到太阳的升起,伦敦时间的八点他们也能见到太阳的升起。

就这样,可以知道,时间戳对地球上的任何一个地方都是一样的,如果我们想要把时间戳转化成当地的时间,就需要根据所在地区的时区进行转化。不同时区之间进行时间转化也是一样的道理,我们需要根据时区的差异来转化当地的时间。

三、使用方法:

3.1  Java8 以前的时间处理:

1,Date类的使用:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;public class TestTime {public static void main(String[] args) {try {//获取Date对象,存放的是时间戳Date date = new Date();//获取时间戳(毫秒)long seconds = date.getTime();System.out.println("当前时间戳: " + seconds);//当前GMT(格林威治)时间、当前计算机系统所在时区的时间SimpleDateFormat beijingFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("本地(东八区)时间: " + beijingFormat.format(date) +"; GMT时间: " + date.toGMTString());//东八区时间转换成东九区(东京)时间,比北京早一个小时SimpleDateFormat tokyoFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");tokyoFormat.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));System.out.println("东京(东九区)时间: "+tokyoFormat.format(date));//时间戳转化成DateSimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String fotmatString = timestampFormat.format(seconds);Date parseDate = timestampFormat.parse(fotmatString);System.out.println("时间戳转化成Date之后的时间: "+parseDate + ";格式化之后的: "+ fotmatString);} catch (Exception e) {e.printStackTrace();}
}
}

输出结果如下:

Date的无参构造函数如下图:

我们可以看到,Date中存放的是时间戳,因此,我们在世界各地调用这个方法,获取到的值都是一样的。只是在不同的地方,这个值会根据时区转化成当地的时间而已。

3.2  Java8 之后的时间处理:

从Java8开始,推出了LocalDate、LocalTime、LocalDateTime这三个工具类,实现了更好地时间处理,我们先看如何使用,然后,再进行比较。

1,工具类的获取与使用:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;public class TestLocalTime {
public static void main(String[] args) {//获取当前时区的日期LocalDate localDate = LocalDate.now();System.out.println("localDate: " + localDate);//时间LocalTime localTime = LocalTime.now();System.out.println("localTime: " + localTime);//根据上面两个对象,获取日期时间LocalDateTime localDateTime = LocalDateTime.of(localDate,localTime);System.out.println("localDateTime: " + localDateTime);//使用静态方法生成此对象LocalDateTime localDateTime2 = LocalDateTime.now();System.out.println("localDateTime2: " + localDateTime2);//格式化时间DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");System.out.println("格式化之后的时间: " + localDateTime2.format(formatter));//转化为时间戳(秒)long epochSecond = localDateTime2.toEpochSecond(ZoneOffset.of("+8"));//转化为毫秒long epochMilli = localDateTime2.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli();System.out.println("时间戳为:(秒) " + epochSecond + "; (毫秒): " + epochMilli);//时间戳(毫秒)转化成LocalDateTimeInstant instant = Instant.ofEpochMilli(epochMilli);LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault());System.out.println("时间戳(毫秒)转化成LocalDateTime: " + localDateTime3.format(formatter));//时间戳(秒)转化成LocalDateTimeInstant instant2 = Instant.ofEpochSecond(epochSecond);LocalDateTime localDateTime4 = LocalDateTime.ofInstant(instant2, ZoneOffset.systemDefault());System.out.println("时间戳(秒)转化成LocalDateTime: " + localDateTime4.format(formatter));
}
}

上述程序运行结果如下图所示:

新推出来的这三个类,与MySQL中的日期时间类型正好对应,如果我们使用MySQL数据库的话,在插入相应字段的时候,都不需要再进行任何的转化了。对应关系如下:

LocalTime  对应  time
   LocalDate  对应  date
   LocalDateTime  对应  datetime(timestamp)

2,增加、减去时间:

看看上图,是不是非常的简单方便呢。

3,LocalDateTime 与 Date 的相互转化

// Date 转化成 LocalDateTime
public static LocalDateTime dateToLocalDate(Date date) {Instant instant = date.toInstant();ZoneId zoneId = ZoneId.systemDefault();return instant.atZone(zoneId).toLocalDateTime();
}
// LocalDateTime 转化成 Date
public static Date localDateTimeToDate(LocalDateTime localDateTime) {ZoneId zoneId = ZoneId.systemDefault();ZonedDateTime zdt = localDateTime.atZone(zoneId);return Date.from(zdt.toInstant());
}

由于 LocalDate、LocalTime 或者只含有日期,或者只含有时间,因此,不能和Date直接进行转化。

四、总结:

了解好时区,时间戳等这几个概念,对于我们了解程序语言中时间类的构造非常有帮助。Java8 新推出来的这三个类,不仅让我们在日常编程中更为高效方便,而且,在与数据库时间类型的对应上更为友好。

最后总结:

1,时间戳: 是指格林威治(地球零时区)时间1970年01月01日00时00分00秒起至现在的总秒数,这个时间戳,在地球的各个地方都是一致的;

2,时区:由于地球的自转,根据接收太阳光照的顺序将地球划分成24个区,从而方便当地人的生产生活,每个时区相差一小时,可以根据时间戳和时区计算当地的时间。格林威治处于零时区,北京处于东八区,因此,北京时间比格林威治时间早8个小时。

3,LocalDateTime 比 Date使用起来更为方便,两者可以相互进行转化。

Java中 LocalDate、LocalTime、LocalDateTime三个时间工具类的使用介绍相关推荐

  1. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  2. Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端

    场景 前端使用Vue,验证码图片的src属性来自于后台SpringBoot接口. 后台验证码接口生成验证码图片并将其使用Base64进行编码. 前端就可以直接使用 data:image/png;bas ...

  3. java获取指定倒退或向前的时间工具类

    最近,业务中碰见需要获取指定的时间,比如向前倒推一定的时间,向后倒推一定的时间,此次记载一下处理的相关代码逻辑, //获取当前时间向后推一天public static String getDayAft ...

  4. Java中阿里云OSS文件上传工具类

    阿里云OSS文件上传下载工具类 前言: 本质上就是获取配置文件信息,然后注入bean,调用sdk中提供的增删改方法: 为了避免同名文件会替换,用了hutool中唯一id生成+文件名做拼接 导入依赖:→ ...

  5. java方法执行的时间_计算Java中任意一个方法的执行时间的工具类

    1 packagealgorithm.study.utils;2 3 importjava.lang.reflect.Method;4 5 /** 6 * This class is getting ...

  6. 基于jdk8 LocalDate系列API的全新实用时间工具类

    基于jdk8 LocalDate系列API的实用时间工具类, 已经经过多个项目的考验与完善, 包含个人心得体会 欢迎转载,转载请注明网址:https://blog.csdn.net/qq_419102 ...

  7. 分享一个Joda-Time日期时间工具类

    写在前面 在JDK1.8之前,处理日期和时间的方式比较单一,Java中提供了Calendar来处理日期,但是过程较为繁琐. 但是在JDK1.8之后,Java更新了time包提供了LocalDate,L ...

  8. 重学Java8新特性(四) : 日期时间API、LocalDateTime、DateTimeFormatter、开发中时间工具类(常用)

    文章目录 一.JDK8中日期时间API的介绍 1.1.LocalDate.LocalTime.LocalDateTime的使用 2.2.Instant类的使用 2.3.DateTimeFormatte ...

  9. Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,

    Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 日期格式化 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在J ...

最新文章

  1. php远程文件包含攻击,PHP “is_a()”函数远程文件包含漏洞
  2. 深度学习pytorch--softmax回归(二)
  3. mnist数据集svm python_python支持向量机分类MNIST数据集
  4. Java打造一款SSH客户端,已开源!
  5. 南邮 md5 collision
  6. Mahout的taste里的几种相似度计算方法
  7. View组件之各xml属性
  8. 实战系列之天气预报实时采集
  9. Matlab来实现DDS功能
  10. 【笔记】Python算法教程(1)
  11. java 自定义的异常类_java自定义异常类实例讲解
  12. Android sockot连接打印机EPSON ESC/POS指令打印
  13. opengl dfdx dfdy
  14. 算法-九九乘阶打印和计算N的乘阶结果
  15. 传感器系列之4.12GPS定位传感器
  16. xposed 框架学习
  17. 【MATLAB】求Taylor展开式
  18. 对uchar* data = image.ptr<uchar>(j)的理解
  19. 初学者如何学好编程?
  20. 调查问卷动态生成的一点探索

热门文章

  1. 系统工程师加薪必备技能-活动目录 (Active Directory)
  2. LeetCode 101. Symmetric Tree
  3. Python中利用numpy将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵)
  4. 5198.丑数III
  5. Pytorch 的迁移学习的理解
  6. Python基础---OS模块 (二)
  7. Javascript设计模式学习二(单例)
  8. redis 配置文件翻译
  9. c语言中int型变量的字节数
  10. Java后端避坑——如何使用注解忽略掉JavaBean的属性值