传统的时间 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. 【洛谷 P2120】 [ZJOI2007]仓库建设(斜率优化)

    题目链接 斜率优化+1,好吧不水分了. 玩具装箱那题以后再做,当作复习吧. \(f[i]=f[j]-(sum[i]-sum[j])*dis[i]+p[i]\) \(f[j]=-dis[i]*sum[j ...

  2. 【译】Linux提权基础

    英文原文: Basic Linux Privilege Escalation 在开始之前,我想指出 - 我不是专家. 据我所知,在这个巨大的领域没有一个“魔法”的答案. 这只是我的发现,写出来,共享而 ...

  3. leetcode.C.4. Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays 这应该是最简单最慢的方法了,因为本身为有序,所以比较后排序再得到中位数. double findMedianSortedArrays(in ...

  4. 项目记录 -- config2html 理解

    html 代码: <table width=1280 border=0 cellspacing=1 cellpadding=1> <tr id=tblhdr> <td&g ...

  5. 33 - 并发编程-线程同步-Event-lock

    目录 1 线程同步 1.1 Event 1.1.1 什么是Flag? 1.1.2 Event原理 1.1.3 吃包子 1.2 Lock 1.2.1 lock方法 1.2.2 计数器 1.2.3 非阻塞 ...

  6. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  7. git常用命令速查表【转】

  8. git@oschina.net源代码管理使用日记【转】

    转自:https://www.cnblogs.com/Juvy/p/3556902.html git的优势: 1 可以创建分支: 2 版本控制是基于每一次提交的,而不需要考虑每次提交了多少个文件. 下 ...

  9. python3.4.3安装allure2记录

    一.安装:cmd执行命令pip install allure-pytest 二.下载allure2:2.7.0版本 https://dl.bintray.com/qameta/generic/io/q ...

  10. 【转载】WebDriver(C#)之十点使用心得

    使用Selenium WebDriver驱动浏览器测试的过程中多多少少会遇到一些折腾人的问题,总结了一部分,做下分享. 一.隐藏元素处理(element not visible) 使用WebDrive ...