Java 8中处理日期和时间示例

https://www.rjkf.cn/java8-date-localdate/

作者:陶清清

链接:https://www.jianshu.com/p/2949db9c3df5

来源:简书

----------------------------------------------------------------------------------------

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

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

Instant:时间戳Duration:持续时间,时间差LocalDate:只包含日期,比如:2016-10-20LocalTime:只包含时间,比如:23:12:10LocalDateTime:包含日期和时间,比如:2016-10-2023:14:21Period:时间段ZoneOffset:时区偏移量,比如:+8:00ZonedDateTime:带时区的时间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);//判断是否为闰年booleanisLeapYear = tomorrow.isLeapYear();System.out.println(isLeapYear);//运行结果2016-10-202016-10-012016-10-012016-10-312016-10-21true

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:21LocalTime 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.996System.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());//4System.out.println(period.getMonths());//1System.out.println(specifyDate.until(today, ChronoUnit.DAYS));//401//输出结果41401

我们可以看到,我们使用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()));//结果20151011

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转为LocalDateTimeDate date2 =newDate();LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());//LocalDateTime转DateLocalDateTime localDateTime3 = LocalDateTime.now();Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();Date date3 = Date.from(instant);//LocalDate转Date//因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间,00:00:00LocalDate localDate4 = LocalDate.now();Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();Date date4 = Date.from(instant);

总结,其实想说的这,这篇文章是一篇难产很久的文章,自从十一假期后,一直找不到写代码的感觉,所以这篇文章拖了1个月。

©声明:除非注明,本站所有文章皆为原创,转载请以链接形式标明本文地址。

©转载请注明来源:https://www.rjkf.cn/java8-date-localdate/

作者:陶清清

链接:https://www.jianshu.com/p/2949db9c3df5

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342