引言

Java 1.0 中引入了 Date 类,Java 1.1 中引入了 Calendar ,Java 8 中引入了java.time API ,这是 Java 非常吸引人的一次对时间日期的升级。它修正了过去的缺陷,同时也清晰易用。在 Java 8 引入time api 中,Instant 代表时间线上的一个点

三个时间类

LocalDate、LocalTime、LocalDateTime

第一个只负责日期相关的处理,第二个负责时间相关的处理,第三个日期时间一起处理,其本质是前两者操作的再封装。

获取当前时间

LocalDateTime now = LocalDateTime.now();
//output : 2018-09-04T14:16:05.323

获取自定义时间

指定字符串:

LocalDateTime nationalDay = LocalDateTime.of(2018, Month.OCTOBER, 1, 14, 30);
// output : 2018-10-01T14:30

指定数字:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime someDay = LocalDateTime.parse("2018-10-01 14:30:30", formatter);
// output : 2018-10-01T14:30:30

日期时间格式化

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String nowStr = now.format(formatter);
// output : 2018-09-04 14:37:32

注意,Java 8 有一个 BUG ,当日期字符串中带有毫秒值,无法成功格式化,是会抛出解析异常:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '20191120100921234' could not be parsed at index 0at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)at java.time.LocalDateTime.parse(LocalDateTime.java:492)at com.ykt.ffan.common.utils.DateUtilPlus.main(DateUtilPlus.java:161)

官方解释说 Java9 已经解决了这个问题,但是Java8 的用户不可能通过升级JDK 来处理线上问题,那么这里贴出我本人的兼容方案:

if (format.contains("SSS")) {try {DateFormat df = new SimpleDateFormat(format);Instant instant = df.parse(dateStr).toInstant();return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();} catch (ParseException e) {e.printStackTrace();}
}

日期比较大小

// LocalDateTime.now() == 2018-09-04 14:42:59
boolean nowIsBefore = LocalDateTime.now().isBefore(nationalDay);// nationalDay == 2018-10-01T14:30:30
// output : true
boolean nowIsAfter = LocalDateTime.now().isAfter(nationalDay);// nationalDay == 2018-10-01T14:30:30
// output : false

日期相差多少年 | 月 | 天 | 小时 | 分钟 | 秒

// now = 2018-09-04T14:50:34.857 ; nationalDay == 2018-10-01T14:30:30
long diffYears = ChronoUnit.YEARS.between(LocalDateTime.now(), nationalDay);
// output : 0
long diffMonths = ChronoUnit.MONTHS.between(LocalDateTime.now(), nationalDay);
// output : 0
long diffDays = ChronoUnit.DAYS.between(LocalDateTime.now(), nationalDay);
// output : 26
long diffHours = ChronoUnit.HOURS.between(LocalDateTime.now(), nationalDay);
// output : 647
long diffMins = ChronoUnit.MINUTES.between(LocalDateTime.now(), nationalDay);
// output :38859
long diffSecs = ChronoUnit.SECONDS.between(LocalDateTime.now(), nationalDay);
// output : 2331188

获取分钟

最简单

int mins2 = LocalDateTime.now().getMinute();
// output : 26

最万能 (用于非默认语义,如天的分钟数)

long mins = LocalDateTime.now().getLong(ChronoField.MINUTE_OF_HOUR);
// output : 26
long mins = LocalDateTime.now().getLong(ChronoField.MINUTE_OF_DAY);
// output : 926

两个特殊枚举

MonthDayOfWeek

获取星期

LocalDateTime sunDay = LocalDateTime.of(2018, 9, 2, 0, 0);DayOfWeek dayOfWeek = sunDay.getDayOfWeek();
// output : SUNDAY
int dayOfWeek = sunDay.getDayOfWeek().getValue();
// output : 7

获取月份

Month month = LocalDateTime.now().getMonth();
// output : SEPTEMBER
int month = LocalDateTime.now().getMonth().getValue();
// output : 9

获取年份

int year = LocalDateTime.now().getYear();
// output : 2018
Year year = Year.now();
// output : 2018

Java8————日期时间 API相关推荐

  1. Java8日期时间API,Java高级多线程面试

    plusNanos(int offset):增加指定纳秒 减少相关的方法 minusYears(int offset):减少指定年 minusMonths(int offset):减少指定月 minu ...

  2. 这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime

    ZoneId java.time.ZoneId类表示时区ID 声明: public abstract class ZoneId implements Serializable ZoneId可以用于在I ...

  3. 6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  4. java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  5. Java8 日期/时间(Date Time)API指南

    Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...

  6. java8 日期api_我们多么想要新的Java日期/时间API?

    java8 日期api 当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投 ...

  7. 高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)

    技术活,该赏 点赞再看,养成习惯 大家好,我是小虚竹.之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来.答案是肯定的,谁让我宠粉呢.由于内容偏多(超十万字了) ...

  8. java8日期加本地,日期时间API(JDK8新增)

    日期时间API(JDK8新增) JDK8出现之前 JDK8新时间日期API LocalDate.LocalTime.LocalDateTime 的使用 类似于Calendar LocalDateTim ...

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

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

最新文章

  1. SAP QA32 做使用决策系统报错:分类数据的不一致性=交易终止
  2. mongoDB的监控工具
  3. 图像处理入门 100 题,有人把它翻译成了中文版!
  4. Jmeter----连接mysql数据库及常见问题处理
  5. Implementation:Bellman-ford
  6. c JAVA 注解,Java元注解作用及使用
  7. [css] 请描述下你对translate()方法的理解
  8. java源代码1000_Java源代码
  9. Python进阶(十一)装饰器
  10. w3cschool实战答案
  11. qemu-img 镜像转换工具使用
  12. 【Excel】【行列转换:转置粘贴 or TRANSPOSE】
  13. RabbitMQ可视化界面登录不了,报错:Login failed
  14. 经济法期末模拟试卷及答案
  15. 文件名依照字符串和数字进行排序
  16. HTML文字左侧留白,DIV CSS padding内补白(内边距)left right top bottom
  17. console用法java_Java Console printf(String, Object)用法及代码示例
  18. 张量网络系列(一 从张量到张量网络)
  19. 中年人学C语言Windows程序设计,9 窗口绘图:直线的画法
  20. 知识普及:HTML 5到底是个什么东西

热门文章

  1. C程序对整数中设置为1的位数进行计数
  2. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)
  3. Windows 创建符号链接
  4. current of 使用
  5. discuz的ajax,discuz分页函数改成基于jqueryd的ajax分页函数
  6. 最长单调递增子序列_最长递增子序列(动态规划 + 二分搜索)
  7. 如何允许网页中的编辑器访问剪切板_Vditor下一代的 Markdown 编辑器,为未来而构建...
  8. vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
  9. 上传文件的php代码,PHP实现大文件上传源代码
  10. java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...