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

zoneId、ZoneOffset、Date、LocalDateTime、ZonedDateTime、OffsetDateTime的区别 1、zoneId2、ZoneOffset继承了zoneId3、ZoneOffset 和 TimeZone区别ZoneOffset 和 TimeZone 是 Java 编程语言中处理时区信息的两个不同的类。ZoneOffset 类:ZoneOffset 是 Java 8 中引入的日期时间 API 的一部分,位于 java.time 包中。它代表了与协调世界时(UTC)之间的固定时间偏移,以固定的小时和分钟表示。例如,+02:00 表示时间比协调世界时快 2 小时。 阅读详情

前言: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 {
    @Override
    public 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 LocalDateTime的基本用法 一、新时间日期API常用、重要对象介绍: ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点(瞬时) LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 Clock: 用于访问当前时刻、日期 阅读详情

相关推荐

一文搞定LocalDate、LocalTime、LocalDateTime

使用自定义日期时间格式化类型,日期时间对象使用format()方法进行格式化输出为字符串使用parse()方法解析字符串为时间日期对象System.out.println("当前日期时间:" + dateTime);// 设置格式化样式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");// 格式化。

玄武后端技术栈 3726

【日期、时区、时间】本地时间转UTC时间详解

/** * 把时间转化为utc时间格式 * * @param localTime * @return */ public static Date translatetoUtc(long localTime, TimeZone localZone) { Calendar cal = Calendar.getInstanc...

m0_45406092的博客 1万+

java8 日期时间

java8 日期时间 Instant LocalDateTime LocalDate LocalTime ZoneId/ZoneOffset ZonedDateTime

xc_oo0的博客 1042

jdk8中新增的日期处理类LocalDate,LocalTime,LocalDateTime,ZoneId,ZonedDateTime详解

jdk8中新增的日期处理类LocalDate,LocalTime,LocalDateTime,ZoneId,ZonedDateTime详解

m0_51527921的博客 1034

Dating Java8系列之新的日期和时间

给我馍馍/文 旧的日期时间 在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因和未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。这意味着,如果你想要用Date表示Java 8的发布日期,即2014年3月18日,需要...

givemomo的博客 920

JDK1.8新特性之时间日期的API

时间日期的API JDK1.8之后提供了一套全新的时间日期API 这套全新的API在 java.time 包下; 这三个日期API里面采用静态方法 now() 获取当前的日期时间 年月日: LocalDate LocalDateTime now = LocalDateTime.now(); System.out.println(now); 时分秒: LocalTime Loc...

空空少年郎的博客 2373

LocalDateTime用法

一.新时间日期API常用、重要对象介绍 ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点(瞬时) LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 Clock: 用于访问当前时刻、日期、

xxdw1992的博客 5万+

睿尔曼超轻量仿人机械臂--机械臂接口介绍

本文介绍了睿尔曼超轻量仿人机械臂的控制器接口及末端接口。

realman_Rop的博客 3437

JAVA基础|常用API-JDK8之后新增的日期,时间

(图片来自黑马程序员)

mingtian_ag的博客 1824

CDR学习笔记——02

这篇写一些高级CDR的架构原理。

... 1016

MCU中GPIO口的驱动方式

MCU中GPIO口的驱动方式 导读: MCU芯片中GPIO口的驱动方式大的可分为输出和输入两类,小的分可以分为8种。 一、四种输入方式 ①上拉输入: 上拉输入抗干扰能力强,特别适合接地信号的输入(比如低电平有效的按键信号输入)。其工作原理如图1所示。 I/O 端口与TTL 施密特触发器之前接入了一个30K~50K 欧姆的上拉电阻,当I/O 端口悬空时,此时MCU 也能读到稳定的高电平状态,...

优快云Frewen的博客 3372

java中LocalDateTime,Instant,ZoneID,ZoneDateTime,DateTimeFormatter类常用的API

LocalDate :代表本地日期(年,月,日,星期)LocalTime:代表本地时间(时,分,秒,纳秒)APILocalDateTime:代表本地日期,时间以上三个类获取对象的方法是:public static xxx.now();//7:可以直接把LocalDateTime对象变成LocalDate对象和LocalTime//也可以把LocalDate和LocalTime对象变成一个LocalDateTime对象。

luosuss的博客 1039

银河麒麟v10-arm版离线安装Portainer

银河麒麟v10-arm版离线安装Portainer

q_hsolucky的博客 3050

Java8 Date API 详解 - LocalDate,LocalDateTime,Instant

转载来源:https://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant   Java8 Date API 详解 - LocalDate,LocalDateTime,Instant   Java 8 Date Time API是开发人员最热门的变更之一。Java从一开始就缺少日期和时间的一致方法,Jav...

YunWisdom 6768

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2588

JDK8新特性(五):JDK8时间日期API

前言 在 JDK8 之前,我们经常使用到的时间API包括(Date、Calendar),Date 与字符串之间的转换使用 SimpleDateFormat 进行转换(parse()、format() 方法),然而 SimpleDateFormat 不是线程安全的。在设计上也是存在一些缺陷的,比如有两个 Date 类,一个在 java.util 包中,一个在 java.sql 包中。...

扛麻袋的少年的博客 6268

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!

写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等。这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大。立志成为架构师的你,必须掌握Java8中的日期和时间API。 本地时间和时间戳 主要方法: now:静态方法,根据当前时间创建对象 of:静态方法,根据指定日期/时间创建对象 plusDays,plusWeeks,plusMonths,plusYears:向当前LocalDate 对象添加几天、几周、几个月、

冰河的专栏 2765

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2361

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

日期处理第二篇:Java8新时间和日期API,看完你就全明白了

本篇主要介绍新增加的时间和日期API,它们被包含在java.time包中,它们的设计目标是提供更简洁、更可靠、更易用的日期和时间处理方式,避免了旧的Date和Calendar类的一些问题。通过这篇文章可以快速掌握Java里的日期和时间处理

分享技术,记录思考和感悟 1314

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 8 中处理日期和时间示例详解

《Java万年演进史:从基础类库到意识流编程》 本文以未来视角回顾了Java语言从1995年到20126年的技术演进历程。文章通过四个主要发展阶段,展现了Java生态的变革:地球时代的基础类库(Apache Commons、Guava等)、企业级框架的兴衰(Spring、Jakarta EE)、现代编程范式(反应式编程、Lombok等),以及新兴技术栈(量子Java、神经接口编程)。特别探讨了构建工具、测试框架和云原生技术的演变,揭示了技术生命周期规律和永恒问题本质。文章最后向历史技术致敬,强调编程作为表达

油墨香^-^的博客 1140

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java8日期与时间API(LocalDate、LocalDateTime、Instant等)

Java8日期与时间API(LocalDate、LocalDateTime、Instant等)

weixin_38370441的博客 1405

Java中LocalDateTime使用及LocalDate、LocalTime详解

LocalDateTime/LocalDate/LocalTime使用详解

雾林小妖的博客 1733

Java8中时间API

Java 8新的日期时间API包含: java.time – 包含值对象的基础包 java.time.chrono – 提供对不同的日历系统的访问。 java.time.format – 格式化和解析时间和日期 java.time.temporal – 包括底层框架和扩展特性 java.time.zone – 包含时区支持的类

Lifelong learning 1253
上一篇: JAVA8 Optional新特性和使用详解
下一篇: OAuth 2.0 简介
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值