Java 8 中处理日期和时间示例
在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.util
和java.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 中处理日期和时间示例相关推荐
- java8 日期比较_20 个案例教你在 Java 8 中如何处理日期和时间?
点击左上角蓝字,关注"SpringForAll社区" 专注分享Spring周边技术内容 前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, ...
- Java8中的日期与时间处理
原文链接:http://www.importnew.com/15637.html 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一 ...
- Java 常用基本类 剖析日期和时间(Java8以前)
这里写目录标题 声明 7.5 剖析日期和时间 7.5.1 基本概念 1.时区 2.时刻和纪元时 3.年历 7.5.2 日期和时间API 1.Date 2.TimeZone 3.Locale 4.Cal ...
- Java中获取日期和时间
Java中获取日期和时间 1.创建 java.util.Calendar 实例,调用其 get()方法传入不同的参数即可获 得参数所对应的值 import java.util.Calender; // ...
- 关于Java中的日期与时间的相关类说明详解
文章目录 1.关于Java元年与时间戳 2.关于Date类 2.1常用API代码展示 3.关于Calendar类 3.1获取Calendar对象 3.2创建自定义的Calendar对象 3.2Cale ...
- 详解java中的日期与时间;新旧API对比;各种日期格式转换
一.基本概念 1.本地时间 不同的时区,在同一时刻,本地时间是不同的. 全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分,北京所在的时区是东八区. 2.时区 GMT ...
- 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器
目录 Pattern类 Matcher类 Java 8 新增的日期.时间格式器 Pattern类 Pattern类的实例是将一个编译好的正则表达式封装起来.因此正则表达式字符串必须先被变异成Patte ...
- SQL获得当前的日期和时间与DB2 中操作日期和时间
星期六 2007年08月18日 要使用 SQL 获得当前的日期.时间及时间戳记,请参考适当的 DB2 寄存器: SELECT current date FROM sysibm.sysdummy1 SE ...
- android 一天多少毫秒,Android中的日期和时间以毫秒为单位
我试图将给定的日期和时间转换为毫秒.我无法实现它.Android中的日期和时间以毫秒为单位 下面是日期和时间格式 02 - 07(DD - MM) 上午八时五十分00秒(HH毫米SS一) 这是我曾尝试 ...
最新文章
- 补全依赖_VIM JavaScript补全(2019)
- 机器学习验证集为什么不再有新意?
- 【GAN优化】详解GAN中的一致优化问题
- 局域网聊天工具的设计与实现 java设计代写代做代码源代码
- 达摩java_JAVA面向对象
- java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
- 系列10—消息中间件
- Chapter1-3_Speech_Recognition(CTC, RNN-T and more)
- win7 未授予用户在此计算机上的请求登录类型,Win7提示未授予用户在此计算机上的请求登录类型...
- python 客户端_Python客户端
- 02333自考软件工程知识点总结、考点串讲、考前复习
- 一元线性回归(最小二乘法)
- 『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径
- slk文件转wma_什么是WMA文件(以及如何打开一个文件)?
- popperjs V2 之应用库 tippy.js 源码阅读
- 垃圾分类数据集(垃圾图片数据集)
- ipv6 无状态地址管理
- 在线html编辑器---htmlarea 附件,在线HTML编辑器htmlarea简单使用
- 小游戏-4339-4399
- edge浏览器字体模糊乱码怎么办