Java8已经出来好久了,然后我们平时工作中也遇到了好多的关于时间转换的问题,基本上就是需要的时间看一看源码,然后拿来直接用,其实真正理解的并不多。今天又遇到了关于String转换的问题,就决定写一篇文章出来。

那么在写具体的LocalDate前,我们先来看下为什么要在Java8中搞一套新的API呢,因为旧的Date类非常的难用,比如,其中的几个构造方法都被标注为@Deprecated,这里我总结了一些Date的一些问题

  • Date这个类既可以描述年月日,也可以描述时分秒,虽然万花筒用起来是挺好的,但是它既可以表示时间戳还可以表示日期,直观看来是不明确的。
  • 而且作为一个日期类,它是可变的。所以作为返回对象时,返回的都应该是它的clone,而不是对象本身,否则的话可能会改变它的结构 。既然它是可变的,也就不是线程安全的,这是Date类面临的很大的问题之一。
    • 这里请注意,Java8的LocalDate是线程安全的是因为它没有提供set方法,也就意味着一旦创建就不能修改值。而Date方法则提供了set方法

  • 在它的内部API中,getMonth返回的是0-11代表的月份,而getYear返回的是基于1900年的,即2018年为118年

下面面是摘自源码的注释
//The value returned is between <code>0</code> and <code>11</code>,
  with the value <code>0</code> representing January.
上面的注释已经指出了,一月是0,而且这个getMonth()方法明确了是@Deprecated。

 /*** Returns a number representing the month that contains or begins* with the instant in time represented by this <tt>Date</tt> object.* The value returned is between <code>0</code> and <code>11</code>,* with the value <code>0</code> representing January.** @return  the month represented by this date.* @see     java.util.Calendar* @deprecated As of JDK version 1.1,* replaced by <code>Calendar.get(Calendar.MONTH)</code>.*/@Deprecatedpublic int getMonth() {return normalize().getMonth() - 1; // adjust 1-based to 0-based}

  • Date类为了兼容SQL,有一个java.sql.Date(这个Date仅包含日期),这就给我们日常的使用带来了很多迷惑。下图是sql.Date的方法

  • 还有一个就是闰秒的问题,闰秒通常会在一个小时内用ntp更新一个好的系统时钟。在引入两个闰秒(至少每六个月一次,实际上每几年一次)的情况下,系统仍在运行的可能性非常小,特别是考虑到您必须不时地重新部署新版本的代码。即使使用动态语言来重新生成类或类似于WAR引擎的东西,也会污染类空间并最终耗尽permgen(这里摘自网络)

而且在我们经常和Date搭配使用的SimpleDateFormat中,parse()中,其中解析的时候,使用了CalendarBuilder calb = new CalendarBuilder();,然后在设置值的时候,是先用
CalendarBuilder的 establish(),establish方法的内容:

//这里是先清空
cal.clear();
...
//然后再设置新的值
cal.setWeekDate(field[MAX_FIELD + WEEK_YEAR], weekOfYear, dayOfWeek);

如果在多个线程中,如果一个线程已经进行了clear(),而另一个线程期望这个值进行读取,可以想象造成的后果,所以如果在多线程中,要么不使用它,要么就要使它是安全的,所以可以:

1. 进行synchronization,虽然这是一个不好的做法
2. 在每个线程中进行单独的实例化,这将造成内存上的消耗,但是这是一个笨办法
3. 最后就是使用ThreadLocal,这是3个方法中最快的(3点建议摘自stackoverflow)


上边说了Date的一些问题,然后我们来说下Java8新增的日期API --- Date Time API

首先让我们来看下包结构。

我们可以看到常用的LocalDate, LocalDateTime, LocalTime.Instant类,这些类都是不可变,并且是线程安全的,没有提供set方法。

  • chrono包,这是一个日历相关的包,A calendar system, used to organize and identify dates 代码注释已经说明了

而且这个日历包是包括ISO日历和非ISO日历的(也就是公历和非公历)

ISO公历:国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》(https://zh.wikipedia.org/wiki/ISO_8601)
比如年由4位数字组成YYYY,或者带正负号的四或五位数字表示±YYYYY。月、日用两位数字表示:MM、DD。只使用数字为基本格式。使用短横线"-"间隔开年、月、日为扩展格式。

非ISO公历:泰国佛教日历,Hijrah日历,Minguo日历

其中LocalDate就是我们的公历,而ThaiBuddhistDate是泰国的佛教日历
输出结果是

当然有了不同的日历就有了转换,看代码

输出是

LocalDate和ThaiBuddhistDate都是Temporal的子类

  • format包,这是一个用于格式化和解析的包,不过我们不会经常用它,LocalDate类本身已经提供了相关操作
  • temporal包,使用字段和单位以及日期时间调整器访问日期和时间。该软件包扩展了基础软件包,为更强大的用例提供了额外的功能,包括
    • 日期时间单位,例如年,月,日和小时
    • 日期时间字段,例如月份,星期几或小时
    • 日期时间调整功能
    • 周的不同定义
    • 比如像Date Time Package图提到的Month,MonthDay都是Temporal的子类
    • 要查找给定日期之后的第一个星期几,请使用TemporalAdjusters.next(DayOfWeek),例如 date.with(next(MONDAY))
  • zone包。支持不同时区和规则的包。


  • 接下来我们来看LocalDate

在LocalDate中,有以下常用的方法,

    public static LocalDate now() {return now(Clock.systemDefaultZone());}public static LocalDate now(ZoneId var0) {return now(Clock.system(var0));}public static LocalDate now(Clock var0) {}public static LocalDate of(int var0, Month var1, int var2) {                ...}public static LocalDate of(int var0, int var1, int var2) {}public static LocalDate ofYearDay(int var0, int var1) {}public static LocalDate from(TemporalAccessor var0) {}public static LocalDate parse(CharSequence var0) {return parse(var0, DateTimeFormatter.ISO_LOCAL_DATE);}public static LocalDate parse(CharSequence var0, DateTimeFormatter var1) {Objects.requireNonNull(var1, "formatter");return (LocalDate) var1.parse(var0, LocalDate::from);}

在上面的代码中,其中now()方法,还有parse(),of(),是比较常用的方法,

输出是

可以看出,使用起来还是很方便的

  • LocalTime

LocalTime是一个不可变类,其实例表示人类可读格式的时间。它的默认格式是hh:mm:ss.zzz。

输出是

基本和LocalDate一样,这里不做太多叙述

  • LocalDateTime

输出是

  • Instant这是一个时间线上的瞬时点时间,可以理解为格林威治时间

我现在的时间是2018年10月9日21点02,输出是


接下来是java8 时间API的一些基本应用
1.转Date

2.转String
now.toString()

3.一般用法

4.String转LocalDate

也可以自己自定义格式

5.取相关的日期

6.取具体时间

7.时间比较

转载于:https://www.cnblogs.com/haoming1100/articles/9763080.html

Java 基础系列-LocalDate相关相关推荐

  1. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...

  2. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  3. 夯实Java基础系列9:深入理解Class类和Object类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. 夯实Java基础系列22:一文读懂Java序列化和反序列化

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  6. 夯实Java基础系列11:深入理解Java中的回调机制

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 夯实Java基础系列14:深入理解Java枚举类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. 夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

最新文章

  1. android 自定义span_Android – 为ClickSpan设置自定义可绘制背景
  2. oracle查询语句注意事项:
  3. 艾伟_转载:string类与StringBuilder类性能比较
  4. MySQL第7天:MySQL的架构介绍之存储引擎
  5. 通向架构师的道路(第十七天)IBM Websphere集群探秘-WASND
  6. ZZULIOJ 1107: 回文数猜想(函数专题)
  7. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.2.2 建立实验室...
  8. Kotlin 条件控制(六)
  9. Next.js提供了基于React的简单通用JavaScript框架
  10. 程序员测试死循环给老板发了10000条短信……
  11. xcodebuild -exportArchive -allowProvisioningUpdates
  12. 管理的两大核心,工作目标、人的价值
  13. 全面概述什么是人工智能?
  14. vscode误更新后,无法连接服务器,报“Acquiring lock on/home/~”和“过程试图写入的管道不存在”错误
  15. 土木/岩土期刊版面费/审稿费统计列表
  16. Disable Win+R from launching Wox
  17. 服务链路追踪类型和区别
  18. HTML5七夕情人节表白网页抖音超火的樱花雨3D相册 HTML+CSS+JavaScript
  19. 强制隐藏windows任务栏(使用快捷键才弹出)(hide the taskbar in win10)
  20. Web自动化测试模式page object的小利器:gizmo

热门文章

  1. sql的执行顺序(from平凡世界)
  2. 人口会一直增长下去吗_想要一直美下去?护肤雷区你避开了吗?
  3. javascript 复选框(checkbox)全选/全不选/反选
  4. cin和cout比scanf和printf慢的原因及解决方案
  5. 设计模式,六大设计原则,类的特性
  6. LayaAir 文本 Text API 详解
  7. windows查询java的进程号命令_将Java服务/命令注册为Windows服务
  8. node.js使用cluster实现多进程
  9. Python模块_json pickle模块
  10. Linux基础学习-NFS网络文件系统实时文件共享