如何在Java 8中愉快地处理日期和时间-程序员宅基地

技术标签: java8  

如何在Java 8中愉快地处理日期和时间


廖雪峰 / 编程 / 2014-12-24 11:40 / 阅读: 1819

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!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_20522337/article/details/79358375

智能推荐

linux刷脚本需要什么工具吗,利用宝塔Linux一键挂载脚本工具挂载www目录方法-程序员宅基地

文章浏览阅读76次。如果我们网友有使用过宝塔面板的应该知道,默认一般都是安装到www目录的。而且我们有很多网友是不会,而且也不知道挂载数据盘。一般我们买到的有些国内的机器,系统盘10GB,数据盘可能有20GB,但是如果你不挂载可能就使用系统盘。我们可以使用宝塔Linux一键脚本工具挂载到默认的www目录。当然如果你有技术能力,那你自己手动挂载然后再去安装。1、centosyum install wget -y &am...

mysql实现MHA高可用详细步骤_mysql mha超详细教程-程序员宅基地

文章浏览阅读1.1k次,点赞6次,收藏3次。一、工作原理MHA工作原理总结为以下几条:(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);(2) 识别含有最新更新的 slave ;(3) 应用差异的中继日志(relay log) 到其他 slave ;(4) 应用从 master 保存的二进制日志事件(binlog events);(5) 通过Manager控制器提升一个 slave 为新 m..._mysql mha超详细教程

在vue项目中实现 将数据导入Excel 三种方式(.xlsx , .csv)_vue 将数据放入excel并导出-程序员宅基地

文章浏览阅读2.2w次,点赞8次,收藏31次。在vue项目中实现 将 ECharts 图表数据导出excel 两种方式_vue 将数据放入excel并导出

Scrum基础知识体系和感想_scrum知识体系-程序员宅基地

文章浏览阅读94次。Scrum自称易懂难精,从整个基础知识体系上来说,确实也是比较简单,并没有太多繁复的内容。简单看,一张图就基本能概括了。整个Scrum的核心还是管理好三大工件的过程怎么去组织和定义,让三大工件能够定期循环起来,Scrum的交付就能够迅速循环了。至于团队来说,由于Scrum没有定义具体的工作方法和工具,因此来自不同的Scrum团队的捏合是需要像新的团队一样存在一个磨合期的。如果希望一个大团队中的所有成员到各个Scrum团队都能即插即用,就必然需要加入工具和流程。同时多个Scrum Master之间需_scrum知识体系

Vue3封装Upload(文件上传/文件预览)组件_vue upload组件-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏3次。本人23应届菜鸟,2月份入职一直工作到现在,工作时间也半年了,记录一下成长过程。由于公司前端使用的是Vue3+Ts+AntdVue封装的Vben-Admin框架,只需看源码,就可分析处理整个的Form表单引用流程,封装只需根据业务需求实现就好。下面就由这两部分组成本文章。由于本人对前端技术了解有限,目前只可以模仿前辈代码,才可以把需求实现的差不多,而且其中很多底层意义不了解,这也是我写这篇文章的原因,来加深学习。_vue upload组件

优化过后的基于采样的路径规划算法(RRT Star)-程序员宅基地

文章浏览阅读2.2k次,点赞8次,收藏31次。一些Advaced Sampling Based Algorithm_rrt star

随便推点

Oracle数据库备份_oracle用管理员身份备份-程序员宅基地

文章浏览阅读598次。创建表空间create tablespace TS datafile 'D:\oracle\oradata\ts.dbf' size 500m autoextend on;select username,default_tablespace from dba_users order by username 1、导出tcd数据库exp tcd/password@ORC..._oracle用管理员身份备份

celery mysql 异步_celery异步框架-程序员宅基地

文章浏览阅读218次。Celery一、官方二、Celery异步任务框架"""1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)2)celery服务为为其他项目服务提供异步解决任务需求的注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求人是一个独立运行的服务 | 医院也是一个独立运行的服务正常...

无论是沃尔玛还是阿里京东 做商超电商可能是最好的选择-程序员宅基地

文章浏览阅读808次。在过去几年里,肆意进击的电商改变了无数个传统零售行业,这份漫长榜单包括但不限于图书、家电、服装、母婴用品:图书行业为了给电商打折而虚标书价、家电行业为了避免电商平台价格战针对不同电商平台开发仅有千分之一微妙差别的家电产品、母婴行业更是从国内打到海外。  不过即便在电商们最肆意的年代,一个传统商超负责人依然骄傲地对腾讯科技表示:“每一个消费者都不会放弃自己‘看’的权利,无论电商如何方便,线下的门

Cocos2d-x3.x Node源码学习_cocos2dx 3.x源码解析-程序员宅基地

文章浏览阅读184次。介绍节点是场景图的基础元素。Node类继承自Ref类。场景图的元素必须是Node对象或它的子类。最常见的Node对象是:Scene,Layer,Sprite,Menu,Label。节点的主要特征是:它们可以包含其他节点的对象(addChild,getChildByTag,removeChild等)他们可以安排定期的回调(schedule,unschedule,等)他们可以执行动作(runAction,stopAction,等)函数解读:public functions //_cocos2dx 3.x源码解析

BerryBoot实现树莓派多系统切换_树莓派如何切换系统-程序员宅基地

文章浏览阅读9.1k次,点赞3次,收藏20次。最新太忙了好久没有更新文章了,前段时间自己通过树莓派+OwnCloud+花生壳打造了自己的私人云盘。最近本人有想通过树莓派搞点其他事情,比如Kodi多媒体、Lakka游戏等等,但是又不想不断的更换SD卡(树莓派默认SD卡为系统盘),于是想到通过BerryBoot来实现系统的切换,无需替换SD卡。一、准备工作1.下载BerryBoot:(sourceforge)下载地址: http..._树莓派如何切换系统

Tomcat原理 (持续更新_tomcat同一个请求访问 list内容会变吗-程序员宅基地

文章浏览阅读1.8k次。HTTP​ 总是由客户端通过建立连接并发送http请求​ 框架源码都好喜欢用三元运算符呀,我发现我用的频率不是很高,以后也会考虑把简单的if语句化简成三元运算符Sockethost​ 在Socket的构造方法中,我注意到这个细节,我发现host不仅可以代表ip地址,还能是网址,说明底层可以把网址解析成对应的ip地址作用​ 书上描述的非常好,用来向网络发送和接受数据。而具体的实现则是由java强大的io流来实现的。​ 如果用这个来实现浏览器功能的话,就先获取out流,然后往这个里面写h_tomcat同一个请求访问 list内容会变吗

推荐文章

热门文章

相关标签