传统的时间 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. Appium修改源码后重新编译

    按照官方的说明下载源码,安装依赖库,具体可从这来: https://github.com/appium/appium/blob/master/docs/en/contributing-to-appiu ...

  2. 127.0.0.1、localhost、0.0.0.0的区别

    在开发web应用的测试环境中,如果希望同一个局域网的同事通过内网IP访问自己的应用,则需要把web服务监听的ip地址改为0.0.0.0.为什么用127.0.0.1不行,而用0.0.0.0就可以呢? f ...

  3. 23、Xpath

    1.什么是Xpath?1.XPath即为XMLPath的简称,它是一种用来确定XML文档中某部分位置的语言.2.HTML可以看做是XML的一种实现,所以selenium用户可以使用这种强大的语言在we ...

  4. linux的防火墙管理

    换oricle-linux7系统后,发现iptables的管理方法有不小的改动,记录一下遇到的问题. iptables linux系统已经默认安装了iptables和firewalld两款防火墙管理工 ...

  5. adb_usb.ini在adb找不到设备时

    不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...

  6. 64_t5

    texlive-mkpattern-svn15878.1.2-33.fc26.2.noarch..> 24-May-2017 15:54 38178 texlive-mkpic-bin-svn3 ...

  7. easyui datagrid 去掉 全选checkbox

    在加载 表格的时候添加事件:onLoadSuccess 在事件中写入下面句,用空代替原有HTML 达到取消效果. $(".datagrid-header-check").html( ...

  8. c++鼠标点点,获取坐标值,放入到txt文件中

    // oj3.cpp : Defines the entry point for the console application.// #include "stdafx.h"#in ...

  9. 渗透常用SQL注入语句合集

    1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select ...

  10. js基础练习(四)

    练习: 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角.试编程.    2   3   4   5 6   7   8   9   10 11 12 13 14 ...