传统的时间 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. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  2. gcc 随笔

    将几个文件编译成一个动态库 libtest.so gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 将test.c与动态库libte ...

  3. 面试整理(3)js事件委托

    事件委托主要用于一个父容器下面有很多功能相仿的子容器,这时候就需要将子容器的事件监听交给父容器来做.父容器之所以能够帮子容器监听其原理是事件冒泡,对于子容器的点击在冒泡时会被父容器捕获到,然后用e.t ...

  4. Linux必备工具Tmux

    之前介绍了Linux的Screen命令,今天介绍一个更为强大的终端工具Tmux. Tmux 是一个用于在一个终端窗口中运行多个终端会话的工具.它基本能替代nohup以及screen,甚至比它们更为强大 ...

  5. 黑色的企业网站后台管理模板html源码

    链接:http://pan.baidu.com/s/1kUMqDU3 密码:83xt

  6. thinkphp 5.0 代码执行漏洞

    https://github.com/vulhub/vulhub/blob/master/thinkphp/5-rce docker-compose -f /home/root/compose.yml ...

  7. bootstrap table 双击可编辑,添加、删除行

    html: <table class="table table-bordered" id="para_table"> <tr> < ...

  8. linux系统cpu使用100%的命令

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...

  9. [How to] MapReduce on HBase ----- 简单二级索引的实现

    1.简介 MapReduce计算框架是二代hadoop的YARN一部分,能够提供大数据量的平行批处理.MR只提供了基本的计算方法,之所以能够使用在不用的数据格式上包括HBase表上是因为特定格式上的数 ...

  10. samba中的pdbedit用法

    pdbedit用于在samba服务器中创建用户: 它的用法包括 pdbedit -a username:新建Samba账户. pdbedit -x username:删除Samba账户. pdbedi ...