文章目录

  • 一、LocalDate、LocalTime、Instant、Duration、Period
    • 1、LocalDate和LocalTime
      • a、LocalDate
      • b、LocalTime
    • 2、合并时间和日期
    • 3、机器日期和时间格式
    • 4、定义Duration 和Period
  • 二、操纵、解析和格式化日期
    • 1、使用TemporalAdjuster
    • 2、打印输出及解析日期
      • a、格式化和解析日期java8提供了线程安全DateTimeFormatter类,创建格式化器最简单的方法时通过它的静态工厂方法及常量。
      • b、按照某个模式创建DateTimeFormatter
      • c、创建本地化的DateTimeFormatter
  • 三、处理不同时区

前言:java8之前我们创建时间new Date或者使用Calendar,很不幸这些类设计的有缺陷,导致使用这些方法写出的代码很容易出错。DateFormat是一个线程不安全的类,在多线程使用会有意想不到的结果出现。在java8中整合了很多Joda-Time的特性。

一、LocalDate、LocalTime、Instant、Duration、Period

如果创建简单的时间和日期。java.time包提供了很多新类帮你解决问题,分别是LocalDate、LocalTime、Instant、Duration、Period实现的接口都是TemporalAccessor,这些类都是final类型的,都不能修改。

1、LocalDate和LocalTime

可以通过of的静态方法创建LocalDate和LocalTime实例。

a、LocalDate

LocalDate date = LocalDate.of(2019, 9, 1);
int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek();
int len = date.lengthOfMonth();
boolean leap = date.isLeapYear();

还可以通过工厂方法系统日期获取当前日期:

LocalDate today = LocalDate.now();

还可以传递一个TemporalField参数给get方法也可以拿到同样的信息。TemporalField是一个接口,ChronoField实现了这一接口。

int year = date.get(ChronoField.YEAR);
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);

b、LocalTime

创建LocalTime也可以使用of静态方法

LocalTime time = LocalTime.of(15, 30, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();

LocalDate和LocalTime都可以使用parse方法将字符串解析为LocalDate或LocalTime

LocalDate date = LocalDate.parse("2019-09-01");
LocalTime time = LocalTime.parse("15:30:20");

2、合并时间和日期

LocalDateTime是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息。
可以使用atTime或atDate创建LocalDateTime

 LocalDateTime dt1 = LocalDateTime.of(2019, 9, 1, 15, 45, 20);LocalDate date = LocalDate.now();LocalTime date1 = LocalTime.now();LocalDateTime dt3 = date.atTime(15, 45, 20);LocalDateTime dt5 = date1.atDate(date);

也可以使用toLocalDate或toLocalTime,从LocalDateTime提取LocalDate或LocalTime。

LocalDate date1 = dt1.toLocalDate();
LocalTime time1 = dt1.toLocalTime();

3、机器日期和时间格式

今天是某年,某月,某日等等作为人我们可以看懂,但是作为机器是看不懂的。从机器角度看,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数。这也是java.time.Instant类对时间建模的方式。基本上是以Unix元年时间(1970年1月1日)开始所经历秒数计算的。
可以使用静态工厂方式创建该实例

  Instant instant = Instant.ofEpochSecond(3);Instant.ofEpochSecond(3,-1000000);//三秒之前的100w纳秒(1秒)Instant.ofEpochSecond(3,1000000);//三秒之后的100w纳秒(1秒)

4、定义Duration 和Period

需要创建Temporal对象之间的Duration (间隔),Duration 类的静态工厂方法between就是为了这个目的设计的。

Duration d1 = Duration.between(time1, time2);
Duration d1 = Duration.between(dateTime1, dateTime2);
Duration d2 = Duration.between(instant1, instant2)

如果是需要以年,月,日的方式对多个时间建模,可以使用Period类。该类也有between方法。

Period tenDays = Period.between(LocalDate.of(2019, 3, 8),
LocalDate.of(2019, 9, 1));

Duration 和Period提供了很多静态方法,可以直接创建对应的实例。

Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);


二、操纵、解析和格式化日期

如果已经有了一个LocalDate对象,想要创建它的修改版本,最直接的方法使用withxxx()方法。withxxx()会创建一个对象的副本。

LocalDate date1 = LocalDate.of(2019, 1, 1);
LocalDate date2 = date1.withYear(2011);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);

还可以加上或者减去一段时间

LocalDate date1 = LocalDate.of(2019, 9, 1);
LocalDate date2 = date1.plusWeeks(1);
LocalDate date3 = date2.minusYears(3);
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);

LocalDate、LocalTime、LocalDateTIme、Instant都有大量的通用方法

1、使用TemporalAdjuster

截止目前看到的日期比较都是相对比较直接的,有时候需要更加复杂的操作。比如,将日期调整到下个周日、下个工作日等。可以使用with的重载版本,向其传递一个更多定制化的TemporalAdjuster对象。

LocalDate date1 = LocalDate.of(2019, 9, 1);
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
LocalDate date3 = date2.with(lastDayOfMonth());

TemporalAdjuster的工厂方法列表


如果没有符合你要求的预定义TemporalAdjuster,你可以创建自己的TemporalAdjuster

//函数式接口
@FunctionalInterface
public interface TemporalAdjuster {Temporal adjustInto(Temporal temporal);
}

例:计算明天的日期,同时过滤掉周六日

public class NextWorkingDay implements TemporalAdjuster {@Overridepublic Temporal adjustInto(Temporal temporal) {DayOfWeek dow =DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));  //当前日期int dayToAdd = 1;if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;return temporal.plus(dayToAdd, ChronoUnit.DAYS);}
}

由于TemporalAdjuster是一个函数式接口你能以lambda方式想该adjuster接口传递行为

date = date.with(temporal -> {DayOfWeek dow =DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));int dayToAdd = 1;if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});

如果你使用lambda方式定义TemporalAdjuster对象,推荐使用TemporalAdjusters的ofDateAdjuster方法

TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(temporal -> {DayOfWeek dow =DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));int dayToAdd = 1;if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});
date = date.with(nextWorkingDay);

2、打印输出及解析日期

a、格式化和解析日期java8提供了线程安全DateTimeFormatter类,创建格式化器最简单的方法时通过它的静态工厂方法及常量。

下面例子,生成不同格式的字符串

LocalDate date = LocalDate.of(2019, 9, 1);
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);//20190901
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);//2019-09-01

可以用prase方法解析字符串

LocalDate date1 = LocalDate.parse("20190901",
DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2019-09-01",
DateTimeFormatter.ISO_LOCAL_DATE);

b、按照某个模式创建DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2019, 9, 1);
String formattedDate = date1.format(formatter);
LocalDate date2 = LocalDate.parse(formattedDate, formatter);

c、创建本地化的DateTimeFormatter

DateTimeFormatter italianFormatter =
DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);
LocalDate date1 = LocalDate.of(2019, 3, 1);
String formattedDate = date.format(italianFormatter); // 1. marzo 2019
LocalDate date2 = LocalDate.parse(formattedDate, italianFormatter);

三、处理不同时区

时区的处理是新版日期和时间API新增的功能。新的java.time.ZoneId替代了老版的java.util.TimeZone。
例:

ZoneId romeZone = ZoneId.of("Europe/Rome");//"区域/城市"

toZoneId可以将老时区对象转换为ZoneId

ZoneId zoneId = TimeZone.getDefault().toZoneId();

为时间点添加区域

LocalDate date = LocalDate.of(2014, Month.MARCH, 18);
ZonedDateTime zdt1 = date.atStartOfDay(romeZone);
LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45);
ZonedDateTime zdt2 = dateTime.atZone(romeZone);
Instant instant = Instant.now();
ZonedDateTime zdt3 = instant.atZone(romeZone);

下面这张图可以更好的让我我们理解LocalDate、LocalTime、LocalDateTime、ZonedDateTime

通过ZoneId可以将LocalDateTime转换为Instant

LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45);
Instant instantFromDateTime = dateTime.toInstant(romeZone);

反之也可以转换为LocalDateTime

Instant instant = Instant.now();
LocalDateTime timeFromInstant = LocalDateTime.ofInstant(instant, romeZone);

LocalDateTime和Date转换实例

  public static void dateToCoverLocadate() {Date date = new Date();Instant instant = date.toInstant();ZoneId zoneId = ZoneId.systemDefault();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);System.out.println(localDateTime);}public static void LocaldateToCoverDate() {LocalDateTime now = LocalDateTime.now();ZoneId zoneId = ZoneId.systemDefault();Instant instant = now.atZone(zoneId).toInstant();Date from = Date.from(instant);System.out.println(from);}

JAVA8 日期和时间(LocalDate、LocalDateTime、ZoneId、Duration、Period、Instant)API 用法详解相关推荐

  1. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

  2. c 语言获取系统时间并打印机,C获取打印机状态API函数详解.docx

    C获取打印机状态API函数详解 using System;using System.Collections.Generic;using System.ComponentModel;using Syst ...

  3. Java8 日期、时间骚操作

    Java8 日期.时间骚操作 LocalDate和LocalTime LocalDate LocalTime LocalDateTime 日期解析与格式化 时间调整 TemporalAdjuster ...

  4. fileinput 时间_JavaScript_Bootstrap Fileinput文件上传组件用法详解,最近时间空余,总结了一些关...

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到phpstudy平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的 ...

  5. java8 日期和时间

    新的日期API:LocalDate //of LocalDate date = LocalDate.of(2022, 3, 18); //parse LocalDate date1 = LocalDa ...

  6. Java日期与时间API(详解全部新与旧API,含代码例子)

    目录 前言必读 二.新与旧API 新的API: 旧的API: 初步使用大全(SimpleDateFormat) 三.代码例子 1.获取当前时间 2.字符串转化为时间 四.新的API 1.LocalDa ...

  7. C#时间格式化(Datetime)用法详解

    Datetime.ToString(String, IFormatProvider) 参数format格式详细用法: 格式字符 关联属性/说明 d ShortDatePattern D LongDat ...

  8. Sql server中时间函数用法详解

    SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate()  2.DateName ( datepart , dat ...

  9. matlab中duration是什么意思,C++ duration(STL duration)模板用法详解

    duration (持续时间) 是定义为时间刻度数的时间间隔,可以指定一个时间刻度是多少秒.因此,时间刻度是衡量时间长短的基础.duration 模板的实例类型的对象定义了 duration.时间刻度 ...

最新文章

  1. 数字图像处理中常用图像分割算法有哪些?
  2. 文档型数据库列一般都是弱项
  3. windows 64 oracle sga,oracle 10g for windows sga区最大多少
  4. FLEX Tree动态获得信息时遇到的问题总结
  5. 语言栈十进制转十六进制_十进制数转二进制、八进制、十六进制等任意进制_C语言「抄作业」...
  6. XOCDE构建提示Command /usr/bin/codesign failed with exit code 1的解决办法
  7. 【Java】反射 Reflection
  8. 各种格式PPC手机软件的安装方法
  9. 使用PID和LQR控制器进行多旋翼飞行器控制
  10. 在html中实现word中打批注的功能
  11. Windows 11 配置Java 环境变量
  12. android系统时间获取方式
  13. 【从零开始的Java开发】1-5-4 ArrayList、HashSet、HashMap 概述与案例
  14. 关于深度思考的一点总结
  15. 笔记本如何同时上内外网
  16. CEPH概述及实验(CEPH部署及群集搭建+节点扩容+数据恢复)
  17. Winform从入门到精通(8)——RichTextBox(史上最全)
  18. 罗技Master 3 滚轮阻尼失效-解决方法
  19. 知乎7w阅读!Android彻底组件化方案实践方法!已整理成文档
  20. 初识0day漏洞以及SQL错误盲注

热门文章

  1. python pip安装pymssql_pip安装pymssql模块时报错“PEP 517”怎样处理
  2. “云安全+云保护” 谜团技术解析
  3. 锤子手机Android auto,分享锤子手机Smartisan OS的几个使用小技巧,效率更高
  4. pycharm配置连接服务器+python环境设置
  5. CoordConv:An intriguing failing of convolutional neural networks and the CoordConv solution
  6. 定积分的基本性质1 线性性质
  7. Android Studio ---------------- 软件使用小细节(更新中。。。。。。)
  8. c++string 加引号_C++|引用计数与shared_ptr智能指针(以实现String类为例)
  9. 【wmi】C++获取windows激活状态
  10. (第39册)《微信小程序游戏开发快速入门到实战》夏敏捷著