这周在阅读《阿里巴巴Java开发手册》时,在并发处理一节的日期处理中,其强调SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果

定义为 static,必须加锁,或者使用 DateUtils 工具类。并且建议如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter

代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。但是,这些JDK1.8新的特性以前都没有用过,因此,学习了下。

一、介绍

Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的。

因此,Java 8引入了一套全新的时间日期API。关于这个新的时间日期库的最大的优点就在于它定义清楚了时间日期相关的一些概念,比方说,瞬时时间(Instant),

持续时间(duration),日期(date),时间(time),时区(time-zone)以及时间段(Period)。同时它也借鉴了Joda库的一些优点,比如将人和机器对时间日期的

理解区分开的。Java 8仍然延用了ISO的日历体系,并且与它的前辈们不同,java.time包中的类是不可变且线程安全的。

二、重要的类介绍

新的时间及日期API位于java.time包中,下面是里面的一些关键的类:

(1)Instant:它代表的是时间戳

(2)LocalDate:不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

(3)LocalTime:它代表的是不含日期的时间

(4)LocalDateTime:它包含了日期及时间,不过还是没有偏移信息或者说时区。

(5)ZonedDateTime:这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

(6)Period:包含的是两个日期之间的天、月、年数差值

(7)Duration:包含是两个日期时间间隔的秒以及纳秒数

下面分别对每个类给出一些小例子,进行介绍。

三、例子

(1)Instant类

/*
Instant学习
*/
Instant now = Instant.now();
System.out.println(now.toString());
//毫秒
System.out.println(now.get(ChronoField.MICRO_OF_SECOND));
// 微秒
System.out.println(now.get(ChronoField.MICRO_OF_SECOND));
// 纳秒
System.out.println(now.get(ChronoField.NANO_OF_SECOND));
// 毫秒转Instant
LocalDateTime localDateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
// 2018-01-14T11:03:35.002
System.out.println(localDateTime);

(2)LocalDate类

/*
LocalDate学习
*/
LocalDate now = LocalDate.now();
System.out.println(now.toString()); //日期加上1天
LocalDate plusDay = now.plusDays(1);
System.out.println(plusDay.toString()); //日期加上一周
LocalDate plusWeek = now.plusWeeks(1);
System.out.println(plusWeek.toString()); //计算当年前的第52天是几月几号
System.out.println("今年的第52天是:" + now.withDayOfYear(52)); //字符串转日期
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
TemporalAccessor dateTempora = dateTimeFormatter.parse("2018-01-14");
LocalDate date = LocalDate.from(dateTempora);
System.out.println(date); //格式化日期
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
String dateStr = dateTimeFormatter1.format(now);
System.out.println(dateStr);

(3)LocalTime类

/*
LocalTime学习
*/
LocalTime now = LocalTime.now();
System.out.println(now.toString()); //时间加上12个小时
System.out.println("plus 12 hours: " + now.plusHours(12));

(4)LocalDateTime类

/*
LocalDateTime学习
*/
// 获得当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 字符串转日期时间。
DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01 12:12:13");
LocalDate date = LocalDate.from(dateTemporal);
System.out.println(date); // 格式化日期时间
DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String dateStr = dateToStrFormatter.format(now);
System.out.println(dateStr);

(5)Period类

/*
Period学习
*/
LocalDate startDate = LocalDate.now();
LocalDate endDate = startDate.plusDays(1); Period period = Period.between(startDate, endDate);
System.out.println("间隔的天数" + period.getDays());
System.out.println("间隔的月数:" + period.getMonths());
System.out.println("间隔的年数:" + period.getYears()); // 直接使用日期类中的方法计算日期间隔
long days = startDate.until(endDate, ChronoUnit.DAYS);
System.out.println("间隔的天数:" + days);
long weeks = startDate.until(endDate, ChronoUnit.WEEKS);
System.out.println("间隔的周数:" + weeks);

(6)Duration类

/*
Duration学习
*/
LocalDateTime start = LocalDateTime.now();
LocalDateTime end = start.plusDays(1);
Duration duration = Duration.between(start, end);
System.out.println("间隔的秒数:" + duration.get(ChronoUnit.SECONDS));
System.out.println("间隔的纳秒数:" + duration.get(ChronoUnit.NANOS));
												

JDK1.8日期时间库学习的更多相关文章

  1. Java8新特性探索之新日期时间库

    一.为什么引入新的日期时间库 Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 关 ...

  2. js非常强大的日历控件fullcalendar.js, 日期时间库: moment.js

    日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https:/ ...

  3. Python中处理日期时间库的使用方法(转载)

    <本文来自公众号“大邓带你玩python”,转载> 用百分之20时间,学会解决百分之80的问题. 常用的库有time.datetime.其中datetime库是对time库的封装,所以使用 ...

  4. 程序员常用6 个 Python 的日期时间库

    内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...

  5. Python中处理日期时间库的使用方法

    常用的库有time.datetime.其中datetime库是对time库的封装,所以使用起来更加便捷.date是指日期时间(年月日)处理,time往往更加细小的单位(小时分秒等)的时间处理. 一.d ...

  6. Java 8——日期时间工具库(java.time)

    一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...

  7. Java日期时间操作基础——包含JDK1.8时间操作新特性

    JDK1.7日期时间操作 示例小结 public class DateTest { public static final String FORMAT_DATE = "yyyy-MM-dd& ...

  8. Boost-date_time库学习

    最近开了boost库的学习,就先从日期-时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的. 以下代码只是入门级的简单学习,更详细的资料参考boost源码.  C+ ...

  9. JAVA日期时间相关库

    Java的日期时间库比较乱,同样一个Date在java.sql下定义,同时也在java.util下也定义了一遍,真不知道SUN是怎么想的. java8以后,java通过jsr310标准引入了一套符合I ...

随机推荐

  1. Linux异常体系之vector_stub宏解析

    ARM-Linux汇编的宏定义语法说明如下: 使用注意: 1.宏定义以.macro开始,以.endm结束 2.可带参数,参数可有默认值 3.直接使用参数的名字\arg vector_stub宏的功能: ...

  2. selenium2 页面对象模型Page Object

    开发Selenium WebDriver测试时,可以使用页面对象模型,这样可使得测试脚本有更高的可维护性,减少了重复的代码,把页面抽象出来.同时页面对象模型也提供了一个注释,帮助缓存远程,避免出现元素 ...

  3. Python 实战一

    列表ID的显示 起初ID显示的是数据库中的id,因为数据库中的id是自增长的,所以删除一条后,这里显示就叉开了,这里使用索引的方式来显示. 这个功能实现的逻辑: 第一:定义一个表格的架构,用id=‘i ...

  4. 修改Typora的快捷键【markdown软件】

    修改Typora的快捷键 魔芋:Typora是一款不错的编写markdowm的软件,推荐使用. 魔芋:修改这个文件conf.user.json   "keyBinding": { ...

  5. luogu1233 木棍加工

    先排个序然后做最长上升子序列就行了. #include <algorithm> #include <iostream> #include <cstdio> usin ...

  6. 封装BackgroundWorker控件(提供源代码下载,F5即可见效果)

    Demo源码 背景 经常做些小程序或者小DEMO的时候会用到异步,多线程来执行一些比较耗时的工作同时将进度及时进行反馈.我通常会使用位于[ System.ComponentModel]命名空间下的Ba ...

  7. hexo博客出现“Cannot GET/xxxx”的错误

    最近在github上搭了一个hexo博客系统,非常轻量级的,只需要几句nodejs命令就搭建完成了.我了解了一下,hexo博客是基于nodejs写的,采用ejs模板引擎编写页面. 因为默认的主题风格不 ...

  8. 大数据学习——spark运营案例

    iplocation需求 在互联网中,我们经常会见到城市热点图这样的报表数据,例如在百度统计中,会统计今年的热门旅游城市.热门报考学校等,会将这样的信息显示在热点图中. 因此,我们需要通过日志信息(运 ...

  9. 小甲鱼零基础入门PYTHON

     000.愉快的开始 00:17:37 ☆  001.我和Python的第一次亲密接触 00:13:26 ★  002.用Python设计第一个游戏 00:24:00 ★  003.小插曲之变量和字符 ...

  10. shiro实现app和web统一登录

    (转自:http://www.cnblogs.com/sunshine-2015/p/5515429.html)   先说下背景,项目包含一个管理系统(web)和门户网站(web),还有一个手机APP ...