JDK1.8日期时间库学习
这周在阅读《阿里巴巴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日期时间库学习的更多相关文章
- Java8新特性探索之新日期时间库
一.为什么引入新的日期时间库 Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 关 ...
- js非常强大的日历控件fullcalendar.js, 日期时间库: moment.js
日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https:/ ...
- Python中处理日期时间库的使用方法(转载)
<本文来自公众号“大邓带你玩python”,转载> 用百分之20时间,学会解决百分之80的问题. 常用的库有time.datetime.其中datetime库是对time库的封装,所以使用 ...
- 程序员常用6 个 Python 的日期时间库
内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...
- Python中处理日期时间库的使用方法
常用的库有time.datetime.其中datetime库是对time库的封装,所以使用起来更加便捷.date是指日期时间(年月日)处理,time往往更加细小的单位(小时分秒等)的时间处理. 一.d ...
- Java 8——日期时间工具库(java.time)
一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...
- Java日期时间操作基础——包含JDK1.8时间操作新特性
JDK1.7日期时间操作 示例小结 public class DateTest { public static final String FORMAT_DATE = "yyyy-MM-dd& ...
- Boost-date_time库学习
最近开了boost库的学习,就先从日期-时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的. 以下代码只是入门级的简单学习,更详细的资料参考boost源码. C+ ...
- JAVA日期时间相关库
Java的日期时间库比较乱,同样一个Date在java.sql下定义,同时也在java.util下也定义了一遍,真不知道SUN是怎么想的. java8以后,java通过jsr310标准引入了一套符合I ...
随机推荐
- Nordic Collegiate Programming Contest 2015 E. Entertainment Box
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...
- V4L2使用V4L2_MEMORY_USERPTR和V4L2_MEMORY_MMAP的区别
视频应用可以通过两种方式从V4L2驱动申请buffer 1. USERPTR, 顾名思义是用户空间指针的意思,应用层负责分配需要的内存空间,然后以指针的形式传递给V4L2驱动层,V4L2驱动会把cap ...
- cyg-apt update 升级报错
现象: $ cyg-apt updatecyg-apt: downloading: http://box-soft.com/setup-2.bz2cyg-apt: downloading: http: ...
- <原创>在PE最后一节中插入补丁程序(附代码)
完整文件 http://files.cnblogs.com/Files/Gotogoo/在PE最后一节中插入补丁程序.zip 在PE文件最后一节中插入补丁程序,是最简单也是最有效的一种,因为PE最后 ...
- Oralce重做日志(Redo Log)
1.简介 Oracle引入重做日志的目的:数据库的恢复. Oracle相关进程:重做日志写进程(LGWR). 重做日志性质:联机日志文件,oracle服务器运行时需要管理它们. 相关数据字典:v$lo ...
- Leetcode 416.分割等和子集
分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...
- solr 创建core
mkdir /var/solr/data/CORE_NAME cp -r /opt/solr/server/solr/configsets/basic_configs/* /var/solr/data ...
- 九度oj 题目1349:数字在排序数组中出现的次数
题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...
- 第002弹:Java 中的值传递和引用传递
在 Java 的代码开发过程中,为了尽可能提高方法的复用性,明确方法的作用,同时防止一个方法内部过于臃肿的问题,往往会创建许多方法,那么不可避免地会涉及到参数传递的问题.通常来说,我们将 Java 中 ...
- iOS长按手势调用两次解决方法
由于以前没有很细致的研究过长按手势,所以今天使用的时候发现长按手势会调用两次响应事件. 主要原因是长按手势会分别在UIGestureRecognizerStateBegan和UIGestureReco ...