JAVA8学习——新的时间日期API&Java8总结

JAVA8-时间日期API

java8之前用过的时间日期类。#

Date

Calendar

SimpleDateFormat

有很多致命的问题。

1.没有时区概念

2.计算麻烦,实现困难

3.类是可变的,线程不安全

之前都是用的这个公认的第三方插件来操作:JodaTime

认识一下Joda#

http://joda.org/

  • Joda-Time 时间的转换

  • Joda-Money 钱币类型的转换

  • Joda-Beans JavaBean的转换

  • Joda-Convert 类型的转换

  • Joda-Collect 集合的操作

  • Joda-Primitive 针对于原生类型的集合

了解JAVA8的时间插件的背景-Joda-Time。

Joda - time

Copy
public boolean isAfterPayDay(DateTime datetime) { if (datetime.getMonthOfYear() == 2) { // February is month 2!! return datetime.getDayOfMonth() > 26; } return datetime.getDayOfMonth() > 28; }

... 自行查阅官网吧:http://joda.org/

关于日期与时间:#

  1. 格林威治标准时间(全球时间的基准)

  2. UTC时间(不带时区的标准时间) : 2010-12-1T11:22:33.567Z+8:00

  3. ISO8601

  4. 网络时区的概念(自行Google)

Joda-Time的学习#

demo入门- 用起来简单,功能强大。(相对于原生API )

Copy
package com.dawa.jdk8.joda; import org.joda.time.DateTime; import org.joda.time.LocalDate; public class JodaTimeTest { public static void main(String[] args) { //java.util.time , 原来的时间对象是可变的. - 线程不安全 //使用joda提供的DateTime DateTime today = new DateTime(); DateTime tomorrow = today.plusDays(3); // 当前日期加三天 System.out.println(today.toString("yyyy-MM-dd")); System.out.println(tomorrow.toString("yyyy-MM-dd")); System.out.println("------"); //修改月中的天 DateTime time = today.withDayOfMonth(1); //当前时区的时间 LocalDate localDate = new LocalDate(); System.out.println(localDate); System.out.println("------"); //获取某个时间的某个月的最大的一天. LocalDate localDate1 = localDate.plusMonths(3);//当前日期加三个月 System.out.println(localDate1); System.out.println("------"); LocalDate.Property property = localDate1.dayOfMonth(); System.out.println(property); LocalDate localDate2 = property.withMaximumValue();//这个月的最大天数 System.out.println(localDate2); System.out.println("------"); //计算两年前的第三月最后一天的日期 DateTime dateTime = new DateTime(); DateTime dateTime1 = dateTime.minusYears(2). monthOfYear().setCopy(3). dayOfMonth().withMaximumValue(); System.out.println(dateTime1); } }

查阅API会用,能满足你的功能性需求就OK了。

Java Date 和 joda Time 是可以相互转换的。

新的demo-通过简单的Demo对其有一个新的认识。

Copy
public class JodaTimeTest3 { //标准UTC的时间: 2014-11-04-T09:22:52 //给定一个UTC标准时间的字符串,转换成Date类型 //由服务器来决定时间 public static Date convertUTC2Date(String utcDate){ try { DateTime parse = DateTime.parse(utcDate, DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")); return parse.toDate(); } catch (Exception e) { return null; } } //传输的时候,使用绝对的UTC格式时间字符串. 由客户端决定如何呈现. //客户在哪个时区,时间就是哪个时区的时间. public static String convertDate2UTC(Date javaDate) { DateTime dateTime = new DateTime(javaDate, DateTimeZone.UTC); return dateTime.toString(); } public static String covertDate2LocalByDateFormat(Date date, String dateFormat) { DateTime dateTime = new DateTime(date); return dateTime.toString(dateFormat); } //所以:用标准的UTC时间来存储日期的话,是不会受时区影响的 public static void main(String[] args) { System.out.println(JodaTimeTest3.convertUTC2Date("2019-11-04T09:22:54.876Z"));//结果会受影响 System.out.println(JodaTimeTest3.convertDate2UTC(new Date())); //返回标准的UTC时间. System.out.println(JodaTimeTest3.covertDate2LocalByDateFormat(new Date(),"yyyy-MM-dd")); } }

JAVA8-新的时间日期API#

Java8的所有的日期和API都是不可变的:确保线程的安全

之前的API对象,都是可变的:是线程不安全的

JAVA8-新日期API的简单使用#

LocalDate

LocalTime

MonthDay

...

Copy
package com.dawa.jdk8.joda; import java.time.*; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalUnit; import java.util.Set; import java.util.TreeSet; public class JavaTimeTest { public static void main(String[] args) { // 获取当前的本地时间. LocalDate localDate = LocalDate.now(); localDate.getYear();//年 localDate.getMonth();// 月 英文形式 localDate.getMonthValue();//月 1-12 localDate.getDayOfMonth(); //得到当月的几号. System.out.println("-------"); //LocalDate 直接使用数字构造. LocalDate localDate1 = LocalDate.of(2019, 3, 3); System.out.println(localDate1); System.out.println("-------"); //月-天 (没有年的) //使用场景:你只关注月和日. 如生日.等 去除年份,不考虑年份. MonthDay monthDay = MonthDay.of(3, 24); //自定义构造 MonthDay monthDay1 = MonthDay.from(localDate1);//从时间中获取 //年-月 (没有日的) YearMonth yearMonth = YearMonth.of(1990, 2); System.out.println(yearMonth); System.out.println(yearMonth.lengthOfMonth()); //月的长度是多少天 System.out.println(yearMonth.lengthOfYear()); //一年有多少天 System.out.println(yearMonth.isLeapYear());//是否是闰年 //localDate 关注年月日 //localTime 关注时分秒 LocalTime now = LocalTime.now(); now.plusHours(3); //增加小时 now.plusMinutes(30); //增加分钟 now.plusSeconds(30);//增加秒 System.out.println("-------"); localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法. System.out.println("-------"); localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法 System.out.println("-------"); Clock clock = Clock.systemDefaultZone(); //时刻 clock.millis();//毫秒数 System.out.println("---------"); //判断两个时间的关系. 之前还是之后,ect... System.out.println(localDate.isAfter(localDate1)); System.out.println(localDate.isBefore(localDate1)); System.out.println(localDate.isEqual(localDate)); //关于时区的概念: ZoneId Set<String> set = ZoneId.getAvailableZoneIds(); set.forEach(System.out::println); //列举出所有的时区的. 国家:名字 //按照顺序打印. 构造块.TreeSet的一个子类的构造块. TreeSet<String> treeSet = new TreeSet<String>() { { addAll(set); } }; treeSet.forEach(System.out::println); //查看实现类的 底层的toString方法就知道了. //关于时区的操作:Asia/Shanghai ZoneId zoneId = ZoneId.of("Asia/Shanghai"); LocalDateTime localDateTime = LocalDateTime.now(); // ZonedDateTime from = ZonedDateTime.from(localDateTime);//带有时区的时间 // System.out.println(from); System.out.println("------"); //判断两个日期之间相隔的:年月日 (周期) Period类的应用. LocalDate localDate2 = LocalDate.now(); LocalDate localDate3 = LocalDate.of(2018, 8, 4); Period period = Period.between(localDate2, localDate3); System.out.println(period.getYears());//相差的年 System.out.println(period.getMonths());//相差的月 System.out.println(period.getDays());//相差的天 // Instant类的使用 . UTC时间的呈现 System.out.println(Instant.now()); } }

ChronoUnit 枚举(类型的类型)

Copy
System.out.println("-------"); localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法. System.out.println("-------"); localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法

不用去管这个月多少天,多少周,只管去增加,减少就行了。

Clock类

Copy
System.out.println("-------"); Clock clock = Clock.systemDefaultZone(); //时刻 clock.millis();//毫秒数

Period类, 周期函数(判断两个时间的 年,月,日。)


如有需要自行查看JDK8提供的时间日期API。

JAVA8学习——总结与回顾#

Lambda表达式

函数式接口

传递值&传递行为

函数式编程思想

方法引用

默认方法

收集器和比较器(Collectors&Comparators)

流的使用

流的底层运行原理

并行与串行

Optional类

时间API

函数式接口的使用

函数式接口出现的原因

方法引用和比较器(Collector)

基础的重要性(和业务没关系)

技术不是孤立的,兼容并包的一些心态。(万一你最初的想法就是错的呢)

需要学习和了解的还有很多


2020年01月08日16:25:21 JAVA8新特性课程学习结束。

posted @   dawa大娃bigbaby  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示
CONTENTS