当前位置: 首页 > news >正文

java8之后的时间api

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


title: java8中更好的处理时间方式
date: 2018-08-06 11:33:43

tags: java

java8中关于时间的操作提供了新的api,相比之前感觉有了很多的提升。
以下内容转自:

https://www.liaoxuefeng.com/article/00141939241051502ada88137694b62bfe844cd79e12c32000


Java 8新增了LocalDateLocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。

java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。

java.util.DateSimpleDateFormatter都不是线程安全的,而LocalDateLocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。

java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDateLocalTimeLocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。

新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。

LocalDate

看看新的LocalDate怎么用:

// 取当前日期:
LocalDate today = LocalDate.now(); // -> 2014-12-24
// 根据年月日取日期,12月就是12:
LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate.parse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date

日期转换经常遇到,比如:

// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
// 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05

LocalTime

LocalTime只包含时间,以前用java.util.Date怎么才能只表示时间呢?答案是,假装忽略日期。

LocalTime包含毫秒:

LocalTime now = LocalTime.now(); // 11:09:09.240

你可能想清除毫秒数:

LocalTime now = LocalTime.now().withNano(0)); // 11:09:09

构造时间也很简单:

LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00

时间也是按照ISO格式识别,但可以识别以下3种格式:

12:00
12:01:02
12:01:02.345

JDBC

最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

SQL -> Java
--------------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime

再也不会出现映射到java.util.Date其中日期或时间某些部分为0的情况了。

最后总结一下,怎么才能愉快地处理日期和时间?答案是:立刻升级到Java 8!

转载于:https://my.oschina.net/northerSong/blog/2049682

相关文章:

  • 站内全文搜索
  • 登录功能测试点
  • vue项目ide(vue项目环境搭建)
  • 逆地址解析协议RARP
  • linux之history命令
  • 阿里、美团、网易、华为等十余厂秋招Java面经大合集
  • flexible.js 兼容bug修复
  • 2018.09.17python学习第五天part3
  • 2018世界人工智能大会
  • Sort Array By Parity
  • 区块链开发公司浅析区块链如何保障安全
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • MTV框架和django基本命令
  • MySQL5.6 主从复制 ERROR 1776 (HY000): Parameters MASTER_LOG_FILE
  • 设计模式代理
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Docker: 容器互访的三种方式
  • learning koa2.x
  • LeetCode算法系列_0891_子序列宽度之和
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL主从复制读写分离及奇怪的问题
  • SpiderData 2019年2月16日 DApp数据排行榜
  • 从tcpdump抓包看TCP/IP协议
  • 给初学者:JavaScript 中数组操作注意点
  • 构建工具 - 收藏集 - 掘金
  • 跨域
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何学习JavaEE,项目又该如何做?
  • 使用API自动生成工具优化前端工作流
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我是如何设计 Upload 上传组件的
  • 小程序开发之路(一)
  • 小程序开发中的那些坑
  • 再次简单明了总结flex布局,一看就懂...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1)(1.11) SiK Radio v2(一)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Python第六天)文件处理
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (笔试题)合法字符串
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转载)Linux网络编程入门
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 使用配置文件
  • .net快速开发框架源码分享
  • @在php中起什么作用?
  • [.net] 如何在mail的加入正文显示图片
  • [<MySQL优化总结>]
  • [16/N]论得趣