在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.utiljava.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateFormat类处理。同时java.util.Date中既包含了日期,又包含了时间,所以java8新的日期和时间库,很好的解决了以前日期和时间类的很多弊端。并且也借鉴了第三方日期库joda很多的优点。

在java8中,java.time包下主要包含下面几个主要的类:

Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间

以及java.time.format包中的

DateTimeFormatter:时间格式化

下面我们通过例子来看如何使用java8新的日期时间库

1、获取今天的日期

LocalDate todayDate = LocalDate.now();
System.out.println("今天的日期:"+todayDate);
//结果
今天的日期:2016-10-20

2、指定日期,进行相应操作

//取2016年10月的第1天
LocalDate firstDay = oneday.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDay);//取2016年10月的第1天,另外一种写法
LocalDate firstDay2 = oneday.withDayOfMonth(1);
System.out.println(firstDay2);//取2016年10月的最后1天,不用考虑大月,小月,平年,闰年
LocalDate lastDay = oneday.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDay);//当前日期+1天
LocalDate tomorrow = oneday.plusDays(1);
System.out.println(tomorrow);//判断是否为闰年
boolean isLeapYear = tomorrow.isLeapYear();
System.out.println(isLeapYear);//运行结果
2016-10-20
2016-10-01
2016-10-01
2016-10-31
2016-10-21
true

3、生日检查或者账单日检查

开发过程中,经常需要为过生日的用户送上一些祝福,例如,用户的生日为1990-10-12,如果今天是2016-10-12,那么今天就是用户的生日(按公历/身份证日期来算),那么通过java8新的日期库,我们该如何来进行判断?

在java8中,可以使用MonthDay,该类不包含年份信息,当然还有一个类是YearMonth

LocalDate birthday = LocalDate.of(1990, 10, 12);
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay today = MonthDay.from(LocalDate.of(2016, 10, 12)); System.out.println(today.equals(birthdayMd));
//结果
true

4、获取当前的时间

日期主要是使用LocalTime,该类不包含日期,只有时间信息

//获取当前的时间
LocalTime nowTime = LocalTime.now(); //结果14:29:40.558//如果不想显示毫秒
LocalTime nowTime2 = LocalTime.now().withNano(0); //14:43:14//指定时间
LocalTime time = LocalTime.of(14, 10, 21); //14:10:21
LocalTime time2 = LocalTime.parse("12:00:01"); // 12:00:01//当前时间增加2小时
LocalTime nowTimePlus2Hour = nowTime.plusHours(2); //16:47:23.144
//或者
LocalTime nowTimePlus2Hour2 = nowTime.plus(2, ChronoUnit.HOURS);

5、日期前后比较

比较2个日期哪个在前,哪个在后,java8 LocalDate提供了2个方法,isAfter(),isBefore

LocalDate today = LocalDate.now();
LocalDate specifyDate = LocalDate.of(2015, 10, 20);
System.out.println(today.isAfter(specifyDate)); //true

6、处理不同时区的时间

java8中,将日期,时间,时区都很好的进行了分离。

//查看当前的时区
ZoneId defaultZone = ZoneId.systemDefault();
System.out.println(defaultZone); //Asia/Shanghai//查看美国纽约当前的时间
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime shanghaiTime = LocalDateTime.now();
LocalDateTime americaDateTime = LocalDateTime.now(america);
System.out.println(shanghaiTime); //2016-11-06T15:20:27.996
System.out.println(americaDateTime); //2016-11-06T02:20:27.996 ,可以看到美国与北京时间差了13小时//带有时区的时间
ZonedDateTime americaZoneDateTime = ZonedDateTime.now(america);
System.out.println(americaZoneDateTime); //2016-11-06T02:23:44.863-05:00[America/New_York]

7、比较两个日期之前时间差

在项目中,经常需要比较两个日期之间相差几天,或者相隔几个月,我们可以使用java8的Period来进行处理。

LocalDate today = LocalDate.now();
LocalDate specifyDate = LocalDate.of(2015, 10, 2);
Period period = Period.between(specifyDate, today);System.out.println(period.getDays());  //4
System.out.println(period.getMonths()); //1
System.out.println(specifyDate.until(today, ChronoUnit.DAYS)); //401
//输出结果
4
1
401

我们可以看到,我们使用Period类比较天数,比较奇怪,他返回的值,并不是2个日期之间总共的天数差,而是一个相对天数差,比如,5月1日,和10月2日,他比较的是仅仅2个天之间的差,那1号和2号,相差1天,而实际上,因为中间相差了好几个月,所以真正的天数差肯定不是1天,所以我们可以使用until,并指明精度单位是days,就可以计算真正的天数差了。

8、日期时间格式解析、格式化

在java8之前,我们进行时间格式化主要是使用SimpleDateFormat,而在java8中,主要是使用DateTimeFormatter,java8中,预定义了一些标准的时间格式,我们可以直接将时间转换为标准的时间格式:

String specifyDate = "20151011";
DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;
LocalDate formatted = LocalDate.parse(specifyDate,formatter);
System.out.println(formatted);
//输出
2015-10-11

当然,很多时间标准的时间格式可能也不满足我们的要求,我们需要转为自定义的时间格式

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY MM dd");
System.out.println(formatter2.format(LocalDate.now()));
//结果
2015 10 11

9、java8 时间类与Date类的相互转化

在转换中,我们需要注意,因为java8之前Date是包含日期和时间的,而LocalDate只包含日期,LocalTime只包含时间,所以与Date在互转中,势必会丢失日期或者时间,或者会使用起始时间。如果转LocalDateTime,那么就不存在信息误差。

//Date与Instant的相互转化
Instant instant  = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();//Date转为LocalDateTime
Date date2 = new Date();
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());//LocalDateTime转Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();
Date date3 = Date.from(instant);//LocalDate转Date
//因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间,00:00:00
LocalDate localDate4 = LocalDate.now();
Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date date4 = Date.from(instant);

Java 8 中处理日期和时间示例相关推荐

  1. java8 日期比较_20 个案例教你在 Java 8 中如何处理日期和时间?

    点击左上角蓝字,关注"SpringForAll社区" 专注分享Spring周边技术内容 前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, ...

  2. Java8中的日期与时间处理

    原文链接:http://www.importnew.com/15637.html 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一 ...

  3. Java 常用基本类 剖析日期和时间(Java8以前)

    这里写目录标题 声明 7.5 剖析日期和时间 7.5.1 基本概念 1.时区 2.时刻和纪元时 3.年历 7.5.2 日期和时间API 1.Date 2.TimeZone 3.Locale 4.Cal ...

  4. Java中获取日期和时间

    Java中获取日期和时间 1.创建 java.util.Calendar 实例,调用其 get()方法传入不同的参数即可获 得参数所对应的值 import java.util.Calender; // ...

  5. 关于Java中的日期与时间的相关类说明详解

    文章目录 1.关于Java元年与时间戳 2.关于Date类 2.1常用API代码展示 3.关于Calendar类 3.1获取Calendar对象 3.2创建自定义的Calendar对象 3.2Cale ...

  6. 详解java中的日期与时间;新旧API对比;各种日期格式转换

    一.基本概念 1.本地时间 不同的时区,在同一时刻,本地时间是不同的. 全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分,北京所在的时区是东八区. 2.时区 GMT ...

  7. 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器

    目录 Pattern类 Matcher类 Java 8 新增的日期.时间格式器 Pattern类 Pattern类的实例是将一个编译好的正则表达式封装起来.因此正则表达式字符串必须先被变异成Patte ...

  8. SQL获得当前的日期和时间与DB2 中操作日期和时间

    星期六 2007年08月18日 要使用 SQL 获得当前的日期.时间及时间戳记,请参考适当的 DB2 寄存器: SELECT current date FROM sysibm.sysdummy1 SE ...

  9. android 一天多少毫秒,Android中的日期和时间以毫秒为单位

    我试图将给定的日期和时间转换为毫秒.我无法实现它.Android中的日期和时间以毫秒为单位 下面是日期和时间格式 02 - 07(DD - MM) 上午八时五十分00秒(HH毫米SS一) 这是我曾尝试 ...

最新文章

  1. 补全依赖_VIM JavaScript补全(2019)
  2. 机器学习验证集为什么不再有新意?
  3. 【GAN优化】详解GAN中的一致优化问题
  4. 局域网聊天工具的设计与实现 java设计代写代做代码源代码
  5. 达摩java_JAVA面向对象
  6. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
  7. 系列10—消息中间件
  8. Chapter1-3_Speech_Recognition(CTC, RNN-T and more)
  9. win7 未授予用户在此计算机上的请求登录类型,Win7提示未授予用户在此计算机上的请求登录类型...
  10. python 客户端_Python客户端
  11. 02333自考软件工程知识点总结、考点串讲、考前复习
  12. 一元线性回归(最小二乘法)
  13. 『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径
  14. slk文件转wma_什么是WMA文件(以及如何打开一个文件)?
  15. popperjs V2 之应用库 tippy.js 源码阅读
  16. 垃圾分类数据集(垃圾图片数据集)
  17. ipv6 无状态地址管理
  18. 在线html编辑器---htmlarea 附件,在线HTML编辑器htmlarea简单使用
  19. 小游戏-4339-4399
  20. edge浏览器字体模糊乱码怎么办

热门文章

  1. 【bzoj5085】最大(二分+乱搞)
  2. JavaScript操作select控件
  3. Bash : test 命令
  4. Ubuntu 16.04下Markdown编辑器Haroopad
  5. Ruby Fiber指南(三)过滤器
  6. Android快速开发框架-ZBLibrary 源码分享
  7. js中两个对象的比较
  8. hibernate hbm2ddl.auto 问题
  9. C#实现的【阿拉伯数字转换成中文大写金额】
  10. SAR 和光学图像配准研究