Java8————日期时间 API
引言
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
两个特殊枚举
Month、DayOfWeek
获取星期
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相关推荐
- Java8日期时间API,Java高级多线程面试
plusNanos(int offset):增加指定纳秒 减少相关的方法 minusYears(int offset):减少指定年 minusMonths(int offset):减少指定月 minu ...
- 这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime
ZoneId java.time.ZoneId类表示时区ID 声明: public abstract class ZoneId implements Serializable ZoneId可以用于在I ...
- 6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- Java8 日期/时间(Date Time)API指南
Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...
- java8 日期api_我们多么想要新的Java日期/时间API?
java8 日期api 当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投 ...
- 高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)
技术活,该赏 点赞再看,养成习惯 大家好,我是小虚竹.之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来.答案是肯定的,谁让我宠粉呢.由于内容偏多(超十万字了) ...
- java8日期加本地,日期时间API(JDK8新增)
日期时间API(JDK8新增) JDK8出现之前 JDK8新时间日期API LocalDate.LocalTime.LocalDateTime 的使用 类似于Calendar LocalDateTim ...
- 重学Java8新特性(四) : 日期时间API、LocalDateTime、DateTimeFormatter、开发中时间工具类(常用)
文章目录 一.JDK8中日期时间API的介绍 1.1.LocalDate.LocalTime.LocalDateTime的使用 2.2.Instant类的使用 2.3.DateTimeFormatte ...
最新文章
- SAP QA32 做使用决策系统报错:分类数据的不一致性=交易终止
- mongoDB的监控工具
- 图像处理入门 100 题,有人把它翻译成了中文版!
- Jmeter----连接mysql数据库及常见问题处理
- Implementation:Bellman-ford
- c JAVA 注解,Java元注解作用及使用
- [css] 请描述下你对translate()方法的理解
- java源代码1000_Java源代码
- Python进阶(十一)装饰器
- w3cschool实战答案
- qemu-img 镜像转换工具使用
- 【Excel】【行列转换:转置粘贴 or TRANSPOSE】
- RabbitMQ可视化界面登录不了,报错:Login failed
- 经济法期末模拟试卷及答案
- 文件名依照字符串和数字进行排序
- HTML文字左侧留白,DIV CSS padding内补白(内边距)left right top bottom
- console用法java_Java Console printf(String, Object)用法及代码示例
- 张量网络系列(一 从张量到张量网络)
- 中年人学C语言Windows程序设计,9 窗口绘图:直线的画法
- 知识普及:HTML 5到底是个什么东西
热门文章
- C程序对整数中设置为1的位数进行计数
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)
- Windows 创建符号链接
- current of 使用
- discuz的ajax,discuz分页函数改成基于jqueryd的ajax分页函数
- 最长单调递增子序列_最长递增子序列(动态规划 + 二分搜索)
- 如何允许网页中的编辑器访问剪切板_Vditor下一代的 Markdown 编辑器,为未来而构建...
- vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
- 上传文件的php代码,PHP实现大文件上传源代码
- java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...