一 我们为什么要学习 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. 优秀的github项目学习

    优秀的github项目学习 后期会陆续添加遇到的优秀项目 https://github.com/chaijunkun

  2. 五年老Android,我决定转后端开发了!

    今天给大家分享一些移动端(Android)开发学习后端开发(Java Web)的一些事儿,不知道从什么时候开始身边的同事都开始陆陆续续的在朋友圈发一些后端的文章如:Nginx.Docker.k8s类的 ...

  3. 从面试官甄别项目经验的角度,说说如何在简历中写项目经验(java后端方向)

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

  4. Mybatis一级缓存和二级缓存总结

    1:mybatis一级缓存:级别是session级别的,如果是同一个线程,同一个session,同一个查询条件,则只会查询数据库一次 2:mybatis二级缓存:级别是sessionfactory级别 ...

  5. Rust 入门 (五)

    定义并介绍结构体 结构体和我们前面学习的元组类似,结构体中的每一项都可以是不同的数据类型.和元组不同的地方在于,我们需要给结构体的每一项命名.结构体较元组的优势是:我们声明和访问数据项的时候不必使用索 ...

  6. 【Android - IPC】之使用Bundle实现IPC

    Android四大组件中,Activity.Service和BroadcastReceiver都支持在Intent中传递Bundle数据.由于Bundle实现了Parcelable接口,所以它可以方便 ...

  7. CSS 了解一下

    CSS 认识一下 1.CSS 的那些事 CSS(Cascading Style Sheets)译「层叠样式表」,我的理解是:各种样式叠加的表. 一个网页,如果没有 CSS,就是穿着"国王的新 ...

  8. python模块IO

    Python之模块IO io概叙 io模块提供了python用于处理各种类型I/O的主要工具,主要有三种类型的I/O:文本I/O,二进制I/O和原始I/O:这些都是通用类型,各种后备存储可使用其中的每 ...

  9. Reachability的用法 判断用户的网络状态

    - (void)viewDidLoad { [super viewDidLoad]; // 监听网络状态发生改变的通知 [[NSNotificationCenter defaultCenter] ad ...

  10. Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)

    View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇  ...