传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API。

一、使用 LocalDate、LocalTime、LocalDateTime

  LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 (ISO-8601 日历系统是国际化组织制定的现代化公民的日期和时间的表达法)日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前时间的时间信息。也不包含与时区相关的信息。

  LocalDate LocalTime LocalDateTime 三个类的使用方式一样,只是代表的不同而已。

  下面就以LocalDateTime作为例子进行示范:

    1.获取当前时间

     /**
* 获取当前时间
*/
@Test
public void test1() {
LocalDateTime now = LocalDateTime.now();
}

    

    2.获取指定时间日期

     /**
* 获取指定时间日期
*/
@Test
public void test2() {
LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
}

   

    3.对时间进行加减操作

     /**
* 对时间进行加减操作
*/
@Test
public void test3() {
LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
//加时间
LocalDateTime time1 = now.plusYears(1).plusMonths(2).
plusDays(3).plusHours(5).plusMinutes(45).
plusSeconds(32);
//剪时间
LocalDateTime time2 = now.minusYears(1).minusMonths(2).
minusDays(3).minusHours(5).minusMinutes(45).
minusSeconds(32);
}

  对旧的时间进行操作之后返回一个新的时间。

    

    4. 获取获取时间的年、月、日

     /**
* 获取时间的年、月、日
*/
@Test
public void test4() {
LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10);
//获取年
int year = now.getYear();
//获取月
Month month = now.getMonth();
//获取月的value值
int monthValue = now.getMonthValue();
//获取在本月的第几天(日)
int dayOfMonth = now.getDayOfMonth();
//获取在本年的第几天
int dayOfYear = now.getDayOfYear();
//获取在本周的第几天(星期几)
DayOfWeek dayOfWeek = now.getDayOfWeek();
//获取小时
int hour = now.getHour();
//获取分钟
int minute = now.getMinute();
//获取秒
int second = now.getSecond();
//获取纳秒
int nano = now.getNano(); }

二、使用 Instant : 时间戳(以Unix 元年 : 1970-01-01 00:00:00 到某个时间之间的毫秒数)

  1. 获取系统当前时间

     /**
* 获取当前时间 默认获取 UTC 时区
*/
@Test
public void test5() {
Instant now = Instant.now();
}

  上面时间默认获取到的是 UTC 时区的时间,与中国时间相差8小时,我们可以给它设置偏移量。

     /**
* 获取中国当前时间
*/
@Test
public void test6() {
Instant now = Instant.now().
atOffset(ZoneOffset.ofHours(8)).toInstant();
}

  2. 获取当前时间的时间戳

     /**
* 获取中国当前时间戳
*/
@Test
public void test7() {
long now = Instant.now().
atOffset(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
}

三、Duration 计算两个时间之间的间隔

     /**
* 获取两个时间之间的间隔
*/
@Test
public void test8() {
Instant now1 = Instant.now();
Instant now2 = Instant.now().
atOffset(ZoneOffset.ofHours(8)).toInstant();
Duration.between(now1, now2); LocalDateTime now3 = LocalDateTime.now();
LocalDateTime now4 = LocalDateTime.of(2018, 6, 10, 10, 10, 10); Duration.between(now3, now4);
}

四、Period 计算两个日期之间的间隔

     /**
* 获取两个日期之间的间隔
*/
@Test
public void test9() {
LocalDate now1 = LocalDate.now();
LocalDate now2 = LocalDate.of(2018, 6, 10); Period.between(now1, now2);
}

五、时间校正器

  TemporalAdjuster:时间矫正器。有时我们可能需要获取一个周末,或者下一个工作日等时间,这里 java8 就为我们提供了一个时间校正器,让我们对时间进行校准。

  TemporalAdjusters:该类通过静态方法提供了大量的常用的TemporalAdjuster的实现供我们使用。

  在localDateTime中,有一个with方法,其中可以让我们去写一TemporalAdjuster接口,而TemporalAdjusters类中,有许多常用的方法,下面就来看看:

     /**
* 时间校正器TemporalAdjuster
*/
@Test
public void test10() {
LocalDateTime now1 = LocalDateTime.now();
//获取月中 第一天
now1.with(TemporalAdjusters.firstDayOfMonth());
//获取下一年的第一天
now1.with(TemporalAdjusters.firstDayOfNextYear());
//获取年中第一天
now1.with(TemporalAdjusters.lastDayOfYear());
//获取月中最后一天
now1.with(TemporalAdjusters.lastDayOfMonth());
//获取下个星期一
now1.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
//自定时时间:下一个工作日,因为这里需要一个接口,所以完全可以自定义方法
now1.with((e) -> {
LocalDateTime now = (LocalDateTime)e;
DayOfWeek dow = now.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY))
return now.plusDays(3);
else if (dow.equals(DayOfWeek.SATURDAY))
return now.plusDays(2);
return now.plusDays(1);
});
}

 六、时间、日期格式化 DateTimeFormatter

  1. 时间转字符串

    在 DateTimeFormatter 中为我们提供了一下多种格式转换方式,我们可以去选择使用。

     /**
* The printer and/or parser to use, not null.
*/
private final CompositePrinterParser printerParser;
/**
* The locale to use for formatting, not null.
*/
private final Locale locale;
/**
* The symbols to use for formatting, not null.
*/
private final DecimalStyle decimalStyle;
/**
* The resolver style to use, not null.
*/
private final ResolverStyle resolverStyle;
/**
* The fields to use in resolving, null for all fields.
*/
private final Set<TemporalField> resolverFields;
/**
* The chronology to use for formatting, null for no override.
*/
private final Chronology chrono;
/**
* The zone to use for formatting, null for no override.
*/
private final ZoneId zone;

    当然,我们也可以自定义时间格式,进行转换。

     /*
* 将时间转换为字符串
*/
@Test
public void test11() {
LocalDate now = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss");
now.format(dtf);
}

  2.将字符串转换为时间

     /*
* 将字符串转换为时间
*/
@Test
public void test12() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss");
LocalDateTime.parse("2018-06-18 21:45:23", dtf);
}

java8新特性——时间日期API的更多相关文章

  1. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  2. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

  3. java8新的时间日期库及使用示例

    转自:https://www.cnblogs.com/comeboo/p/5378922.html 来自:Java译站 链接:http://it.deepinmind.com/java/2015/03 ...

  4. Java 8 新的时间日期 API

    1. 概述 1.1 简介 Java 8 引入了一套全新的时间日期API,操作起来更简便.简单介绍下,LocalDate和LocalTime和LocalDateTime的使用: java.util.Da ...

  5. Java8 新特性(三) - 日期时间对象以及一些其他特性

    日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...

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

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  7. Java8 新特性 Data Time API

    Java8新的日期类型 在Java8以前,Date日期API对我们非常的不友好,它无法表示日期,只能以毫秒的精试来表示时间,并且可以修改,他的线程还不是安全的.所以Java8中引入了全新的日期和时间A ...

  8. Java8 新特性之Stream API

    1. Stream 概述 Stream 是Java8中处理集合的关键抽象概念,可以对集合执行非常复杂的查找,过滤和映射数据等操作; 使用 Stream API 对集合数据进行操作,就类似于使用 SQL ...

  9. 【Java8新特性】Stream API有哪些中间操作?看完你也可以吊打面试官!!

    写在前面 在上一篇<[Java8新特性]面试官问我:Java8中创建Stream流有哪几种方式?>中,一名读者去面试被面试官暴虐!归根结底,那哥儿们还是对Java8的新特性不是很了解呀!那 ...

随机推荐

  1. javascript中各类的prototype属性

    prototype 作用:获取调用对象的对象原型引用 应用:可以为某对象原型添加方法 例: function getMax() { var max = this[0]; for(var x=0; x& ...

  2. 【BZOJ】2406 矩阵

    [算法]二分+有源汇上下界可行流 [题解]上下界 题解参考:[BZOJ2406]矩阵(二分+有源汇有上下界的可行流) #include<cstdio> #include<algori ...

  3. 【BZOJ】1951[Sdoi2010]古代猪文

    [题意]给定G,N,求: $$ans=G^{\sum_{i|n}\binom{n}{i}}\ \mod\ \ p$$ 1<=N,G<=10^9,p=999911659. [算法]欧拉定理+ ...

  4. text-align: justify;不能均匀分布问题

    本文地址:http://www.cnblogs.com/veinyin/p/7617610.html  对于text-align来说,一般我们都是使用居中这个属性值,突然今天需要达到这样一个效果: 对 ...

  5. js常见易错点

    原文:http://www.jianshu.com/p/1c77853d4f01 前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函 ...

  6. Coursera在线学习---第五节.Logistic Regression

    一.假设函数与决策边界 二.求解代价函数 这样推导后最后发现,逻辑回归参数更新公式跟线性回归参数更新方式一摸一样. 为什么线性回归采用最小二乘法作为求解代价函数,而逻辑回归却用极大似然估计求解? 解答 ...

  7. [转载]锁无关的(Lock-Free)数据结构

    锁无关的(Lock-Free)数据结构 在避免死锁的同时确保线程继续 Andrei Alexandrescu 刘未鹏 译 Andrei Alexandrescu是华盛顿大学计算机科学系的在读研究生,也 ...

  8. HDFS RAID实现方案(转)

    原文链接:http://blog.chinaunix.net/uid-20196318-id-3213700.html 分布式文件系统主要用于解决海量数据存储的问题,如Goolge.Facebook等 ...

  9. [ python ] 变量及基础的数据类型

    python2 和 python3 不同的编码方式 python2 默认编码方式是 ascii码 python3 默认编码方式是 utf-8 具体表现为:当 python3 和 python2 在打印 ...

  10. python爬取漫画

    抓取漫画的网址是:sf互动传媒 抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩 首页中每个漫画的url是类似这样存储的: <tr> <td height="3 ...