一 我们为什么要学习 java.timeAPI

  1. 原先的Date and Calendar 类的api比较复杂,不易于理解,应用起来不是很灵活。
  2. Calendar 是个线程不安全的类会导致SimpleDateFormat线程不安全。
  3. java.time是JSR 310: Date and Time API.规范所开发,其所有类都是线程安全的或者是枚举类型的类
  4. java.time 的API 使用简单,能够灵活计算时间,矫正时间。

二 LocalDate

LocalDate 是 日期,在java.time 中 日期和时间是可以分开和组合的。

2.1 创建date的方式

 // 创建date的方式
@Test
public void LocalDateTest(){
// 1当前日期 常用
LocalDate now = LocalDate.now();
System.out.println(now);//2019-10-27
// 2指定年月 日 方式 常用
LocalDate ofDate = LocalDate.of(2018, 8, 8);
System.out.println(ofDate);//2018-08-08
// 3使用Clock方式创建 不常用
Clock clock = Clock.systemDefaultZone();
LocalDate date = LocalDate.now(clock);
System.out.println(date);// 2019-10-27
// 4 指定年份 和 一年的天数进行创建
LocalDate localDate = LocalDate.ofYearDay(2018, 256);
System.out.println(localDate);// 2018-09-13 }

2.2 使用LocalDate读取date

 @Test
public void LocalDateTest2(){
// 创建时间
LocalDate date = LocalDate.of(2019,10,27);
// 获得年份 2019
date.getYear();
System.out.println(date.getYear());
// 获得一个月中的第几天 27
date.getDayOfMonth();
System.out.println(date.getDayOfMonth());
// 获得星期 SUNDAY
date.getDayOfWeek();
System.out.println(date.getDayOfWeek());
// 获得一年中的第几天 300
date.getDayOfYear();
System.out.println(date.getDayOfYear());
// 获得月份值 10
date.getMonthValue();
System.out.println(date.getMonthValue());
// 获得月份长度 31
date.lengthOfMonth();
System.out.println(date.lengthOfMonth());
// 是否是闰年 false
date.isLeapYear();
System.out.println(date.isLeapYear()); }

2.3 TemporalField 读取 LocalDate 的值

ChronoField 是个枚举其实现了TemporalField接口,除了2.2的方式读取date我们还可以使用ChronoField方式读取date.

    // 使用 TemporalField 读取 LocalDate 的值
@Test
public void LocalDateTest3() {
// 创建时间
LocalDate date = LocalDate.of(2019, 10, 27);
// 获得年份 2019
date.get(ChronoField.YEAR);
System.out.println(date.get(ChronoField.YEAR));
// 获得月份 10
date.get(ChronoField.MONTH_OF_YEAR);
System.out.println(date.get(ChronoField.MONTH_OF_YEAR));
// 获得这个月中的第几天 27
date.get(ChronoField.DAY_OF_MONTH);
System.out.println(date.get(ChronoField.DAY_OF_MONTH));
// 获得这个星期的第几天 7
date.get(ChronoField.DAY_OF_WEEK);
System.out.println(date.get(ChronoField.DAY_OF_WEEK));
// 其他不再举例自行研究都是字面意思很好理解 }

2.4 解析LocalDate

   @Test
public void LocalDateParse(){
// 默认支持格式解析
String dateStr = "2019-10-27";
LocalDate parse = LocalDate.parse(dateStr);
System.out.println(parse);//2019-10-27
// 指定格式解析
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse("2019/10/27", dateTimeFormatter);
System.out.println(date);//2019-10-27
}

2.5 使用 Period 操纵 date

获得连个日期之间的差值,可以获得年,月,日,判断是否非0等等。

    @Test
public void LocalDatePor(){
LocalDate date1 = LocalDate.of(2019, 10, 27);
LocalDate date2 = LocalDate.of(2019, 10, 25);
Period between = Period.between(date2, date1);
System.out.println(between.getDays());// 2
}

2.6 修改date

通过withAttribute修改不会改变原来的date,会在原来date的基础上形成新的LocalDate副本。

    // 修改
@Test
public void LocalDateWith(){
LocalDate date1 = LocalDate.of(2019, 10, 27);
LocalDate date2 = date1.withMonth(9);//2019-09-27
System.out.println(date2);
LocalDate date3 = date2.withYear(2018);//2018-09-27
System.out.println(date3);
// 2019-10-27
System.out.println(date1);
}

2.7 使用 TemporalAdjuster 修改日期

TemporalAdjuster 时间矫正器修改时间也是不会改变原来的date,会新生成LocalDate 副本,相比于withAttribute,其API更加丰富,提供大量的静态工厂方法,能满足我们日常开发需求。

    //  TemporalAdjuster youku1327
@Test
public void LocalDateTemporalAdjuster(){
LocalDate date1 = LocalDate.of(2019, 10, 27);
LocalDate date2 = date1.with(TemporalAdjusters.firstDayOfMonth());
// 2019-10-01
System.out.println(date2);
LocalDate date3 = date1.with(TemporalAdjusters.firstDayOfYear());
// 2019-01-01
System.out.println(date3);
LocalDate date4 = date1.with(TemporalAdjusters.lastDayOfYear());
// 2019-12-31
System.out.println(date4); }

三LocalTime

如果你已经掌握了上述的LocalDate的基本用法,那么学习LocalTime也是十分简单,原因是LocalTime和LocalDate的API基本差不多。

3.1 创建LocalTime

    @Test
public void localTimeTest1(){
// 1当前时间
LocalTime now = LocalTime.now();
System.out.println(now);//22:49:03.360
// 2指定时间
LocalTime of = LocalTime.of(22, 47);
System.out.println(of);//22:47 }

3.2 读取时间

@Test
public void localTimeRead(){
// 1指定时间
LocalTime tiem = LocalTime.of(22, 50);
// 小时
int hour = tiem.getHour();
// 分钟
int minute = tiem.getMinute();
// 秒
int second = tiem.getSecond();
// 纳秒
int nano = tiem.getNano(); }

3.3 时间解析

 // 解析时间
@Test
public void localTimeParse(){
// 默认支持格式解析
LocalTime parse = LocalTime.parse("22:50:00");
System.out.println(parse);// 22:50
// 指定格式解析
LocalTime time = LocalTime.parse("22:50:00", DateTimeFormatter.ISO_TIME);
System.out.println(time);// 22:50 }

3.4 时间修改

    //
@Test
public void localTime(){
// 1时间
LocalTime time = LocalTime.of(22, 50);
LocalTime time1 = time.withHour(2);//02:50
System.out.println(time1);
LocalTime time2 = time.withMinute(10);//22:10
System.out.println(time2);
}

3.5 使用Duration获得时间差值

  @Test
public void localTime(){
LocalTime time1 = LocalTime.of(22, 50,20,20);
LocalTime time2 = LocalTime.of(23, 10);
// 差值
Duration duration = Duration.between(time1, time2);
long seconds = duration.getSeconds();
int nano = duration.getNano();
System.out.println(seconds);//1179
System.out.println(nano);//999999980 }

四 LocalDate 和 LocalTime 的相互合并和转换

LocalDate 和 LocalTime 能相互合并成 LocalDateTime ,LocalDateTime 也可以转为 LocalDate 或者 LocalTime。

LocalDateTime其他的API 跟 LocalTime,LocalDate 差不多,在次不赘述。

    // youku1327 谢谢 lsc
@Test
public void LocalDateTimeTest(){
LocalDate date = LocalDate.of(2019, 10, 27);
LocalTime time = LocalTime.of(23, 20, 00);
// 合并为 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.of(date, time);
System.out.println(localDateTime);//2019-10-27T23:20
// 转为LocalDate
LocalDate localDate = localDateTime.toLocalDate();
System.out.println(localDate);//2019-10-27
// 转为 LocalTime
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);// 23:20
}

五 ZoneId

java8中 java.time.ZoneId代替了老版本java.util.TimeZone 。

5.1 时区偏移

默认是当前时区和UTC /格林威治的固定偏差值

    @Test
public void TimeZoneId(){
// 上海
ZoneId shanghai = ZoneId.of("Asia/Shanghai");
LocalDate date = LocalDate.of(2019, 10, 27);
// 设置时区
ZonedDateTime zonedDateTime = date.atStartOfDay(shanghai);
// 获得偏移
ZoneOffset offset = zonedDateTime.getOffset();
System.out.println(offset);//+08:00
}

5.2 TimeZone 转 ZoneId

    @Test
public void TimeZoneId2(){
ZoneId zoneId = TimeZone.getDefault().toZoneId();
String id = zoneId.getId();
System.out.println(id);//Asia/Shanghai
}

5.3 时区时间计算

    @Test
public void TimeZoneId3(){
ZoneId zoneId = ZoneId.of("America/Chicago");
Instant instant = Instant.now();
// 上海时间 2019-10-27T23:51:27.168
System.out.println(LocalDateTime.ofInstant(instant,ZoneId.of("Asia/Shanghai")));
ZonedDateTime zonedDateTime = instant.atZone(zoneId);
ZoneOffset offset = zonedDateTime.getOffset();
// 美国芝加哥离上海时区差值 -05:00
System.out.println(offset);
LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
// 芝加哥时间
System.out.println(localDateTime);//2019-10-27T10:51:27.168
}

java8-date和timeAPI的更多相关文章

  1. java8 Date/Time API 新的日期处理工具

    接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Date/Time api 进行说明,新的日期时间工具全部都在 java.time 及其子包中. 新 ...

  2. Java8 Date与LocalDate互转

    Java8 日期时间API,新增了LocalDate.LocalDateTime.LocalTime等线程安全类,接下来要说的是LocalDate与java.util.Date之间的转换. 1.Loc ...

  3. java8 Date相关工具

    自己整理的java8 常用的工具类 /** * @Author taozhaoyang * @Description 结合 java8 线程安全 * @Date 9:55 2018/7/30 **/ ...

  4. java8 Date Localdatetime instant 相互转化(转) 及当天的最大/最小时间

    Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...

  5. java8 Date LocalDate LocaDateTime 互相转化

    java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...

  6. Java8 Date API

    一 .Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数.某一个特定的时间点也 ...

  7. Java8时间的简单时间

    package com.java8.date; import org.junit.Test; import java.text.SimpleDateFormat; import java.time.* ...

  8. JAVA8之日期操作详解

    package org.date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; im ...

  9. how-to-convert-string-to-localdate

    Few Java examples show you how to convert a String to the new Java 8 Date API – java.time.LocalDate ...

  10. Jackson快速入门

    1.Jackson的简单用法 2.Jackson框架的高阶应用 3.Jackson不支持Java8 Date解决方法 https://www.cnblogs.com/mkxzy/p/7091381.h ...

随机推荐

  1. 根据本地ip获取地理位置,再根据地理位置,获取天气

    import json,requestsfrom urllib.request import urlopenfrom pyquery import PyQuery as pqfrom lxml imp ...

  2. python3 之 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束. 迭代器只能往前不会后 ...

  3. python3 pip报错 TypeError: 'module' object is not callable

    使用命令:python -m pip install xx即可,需要在pip前加python -m

  4. Windows之Java开发环境快速搭建

    说明:Node.js非必须,通常中小公司或创业公司,基本上都要求全栈. 补充说明: 除此之外,当公司固定JDK.Maven.Idea.Git.Node.js及其相关IDE等版本时,运维人员或者Team ...

  5. c#关于数据和方法在不同类中的引用-xdd

    关于数据和方法在不同类中的引用 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  6. win10 下安装zookeeper+Kafka 的详细步骤(2)

    Win10 下要使用Kafka需要经过以下三个步骤: 1.安装JDK(需要安装依赖java JDK) 2.安装zookeeper(资源协调,分配管理) 3.使用Kafka开发 ============ ...

  7. 程序员的算法课(18)-常用的图算法:广度优先(BFS)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  8. 【Android - 控件】之V - ViewPager的使用

    ViewPager是Android V4包中的一个控件,常常用来作为首页的滚动广告,也常常结合Fragment来实现页面的切换效果. ViewPager和ListView有很多相似的地方,都是适配器控 ...

  9. Centos 6.x Openssh 升级 7.7p1 版本

    OpenSSH 升级 目前在一家金融公司上班,正好赶上金融公司各种暴雷,本人心里慌慌的. 然后就是金融公司要进行的最低的三级等保评测,各种修改系统安全,密码强度.WAF.防火墙等各种. 评测公司对我司 ...

  10. mysql客户端 navicat 本地导入sql文件出错

    以前遇到过这个问题,找了半天度娘没解决,然后就放弃了. 因为是自己 demo 的项目 所以就自己手动建表了. 现在实习了,去到公司下载下代码来,拿上sql 导入发现还是报错, 根本没法整,然后自己都不 ...