Java 时间日期处理,工作必用(建议收藏)

news2024/11/13 23:22:39

工作中经常会遇到对时间日期进行处理的业务,像日期类的API个人觉得不需要背,需要的时候去查资料就行。我整理了Java8之前及之后日期类常用的时间日期处理方法,方便工作需要时查找,觉得有用的朋友可以收藏。

在这里插入图片描述

一、日期格式化和解析

java.util.Date类

格式化操作

public void oldFormat(){
    Date now = new Date();
    //format yyyy-MM-dd
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String date  = sdf.format(now);
    System.out.println(String.format("date format : %s", date));

    //format HH:mm:ss
    SimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");
    String time = sdft.format(now);
    System.out.println(String.format("time format : %s", time));

    //format yyyy-MM-dd HH:mm:ss
    SimpleDateFormat sdfdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String datetime = sdfdt.format(now);
    System.out.println(String.format("dateTime format : %s", datetime));
}

解析:字符串转日期格式

//已弃用
Date date = new Date("2021-01-26");
//替换为
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2021-01-26");

LocalDate、LocalTime、LocalDateTIme类

格式化:

public void newFormat(){
    //format yyyy-MM-dd
    LocalDate date = LocalDate.now();
    System.out.println(String.format("date format : %s", date));

    //format HH:mm:ss
    LocalTime time = LocalTime.now().withNano(0);
    System.out.println(String.format("time format : %s", time));

    //format yyyy-MM-dd HH:mm:ss
    LocalDateTime dateTime = LocalDateTime.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String dateTimeStr = dateTime.format(dateTimeFormatter);
    System.out.println(String.format("dateTime format : %s", dateTimeStr));
}

解析:字符串转日期格式

LocalDate date = LocalDate.of(2021, 1, 26);
// 或
LocalDate date1 = LocalDate.parse("2021-01-26");
System.out.println(date);

LocalDateTime dateTime = LocalDateTime.of(2021, 1, 26, 12, 12, 22);
// 或
LocalDateTime dateTime1 = LocalDateTime.parse("2021-01-26T12:12:22");
System.out.println(dateTime);

LocalTime time = LocalTime.of(12, 12, 22);
// 或
LocalTime time1 = LocalTime.parse("12:12:22");
System.out.println(time);

二、日期对象转换

Date转LocalDate类

如果要将java.util.Date转换为java.time.LocalDate,可以使用以下步骤:

1)将java.util.Date转换为ZonedDateTime。

2)使用它的toLocalDate()方法从ZonedDateTime获取LocalDate。

Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();

// atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
System.out.println("Date = " + date);
System.out.println("LocalDate = " + localDate);

LocalDate转Date类

如果要将LocalDate转换回java.util.Date,可以使用以下步骤:

1)使用ZonedDateTime将LocalDate转换为Instant。

2)使用from()方法从Instant对象获取Date的实例

ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = LocalDate.now();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

Date date = Date.from(zdt.toInstant());

System.out.println("LocalDate = " + localDate);
System.out.println("Date = " + date);

三、日期间隔计算

java.util.Date类

 //算两个日期间隔多少天,计算间隔多少年,多少月方法类似
 String dates1 = "2022-08-23";
 String dates2 = "2022-02-26";
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 Date date1 = format.parse(dates1);
 Date date2 = format.parse(dates2);
 int day = (int) ((date1.getTime() - date2.getTime()) / (1000 * 3600 * 24));
 System.out.println(dates1 + "和" + dates2 + "相差" + day + "天");
 //结果:2022-08-23和2022-02-26相差178天

java.time.LocalDate类

//算两个日期间隔多少天,计算间隔多少年,多少月
LocalDate date1 = LocalDate.parse("2022-08-23");
LocalDate date2 = LocalDate.parse("2022-02-26");
Period period = Period.between(date1, date2);
System.out.println("date1 到 date2 相隔:"
        + period.getYears() + "年"
        + period.getMonths() + "月"
        + period.getDays() + "天");
//打印结果是date1 到 date2 相隔:0年-5月-25天
//这里period.getDays()得到的天是抛去年月以外的天数,并不是总天数

//如果要获取纯粹的总天数应该用下面的方法,toEpochDay返回距离1970年1月1日的天数的long值
long day = date1.toEpochDay() - date2.toEpochDay();
System.out.println(date1 + "和" + date2 + "相差" + day + "天");
//打印结果:2022-08-23和2022-02-26相差178天

Java8中引入了两个与日期相关的新类:

  • Period - 计算两个“日期”间隔的类
  • Duration - 计算两个“时间”间隔的类

Period 类与 Duration 类都是一段持续时间的概念,如果需要对比时间,它们就需要一个固定的时间值,所以就需要 LocalDate 类与 Instant 、LocalTime、LocalDateTime类来配合它们使用:

Period 对应使用 LocalDate ,它们的作用范围域都是日期(年/月/日)
Duration 对应使用 Instant、LocalTime、LocalDateTime,它们的作用范围域都是时间(天/时/分/秒/毫秒/纳秒)

Duration常用API:

在这里插入图片描述

LocalDateTime start = LocalDateTime.parse("2022-12-03T10:15:30");
LocalDateTime end = LocalDateTime.parse("2023-12-01T10:25:33");

//between的用法是end-start的时间,若start的时间大于end的时间,则所有的值是负的
Duration duration = Duration.between(start, end);

String timeString = duration.toString(); //此持续时间的字符串表示形式,使用基于ISO-8601秒*的表示形式,例如 PT8H6M12.345S
System.out.println("相差的天数="+duration.toDays());
System.out.println("相差的小时="+ duration.toHours());
System.out.println("相差的分钟="+duration.toMinutes());
System.out.println("相差的毫秒="+duration.toMillis());
System.out.println("相差的纳秒="+duration.toNanos());
System.out.println("timeString时间="+timeString);

//isNegative返回Duration实例对象是否为负
System.out.println(Duration.between(start, end).isNegative());//false  end-start为正,所以此处返回false
System.out.println(Duration.between(end, start).isNegative());//true   start-end为负,所以此处返回true
System.out.println(Duration.between(start, start).isNegative());//false start-start为0,所以此处为false

执行结果:
相差的天数=363
相差的小时=8712
相差的分钟=522730
相差的毫秒=31363803000
相差的纳秒=31363803000000000
timeString时间=PT8712H10M3S
false
true
false

Period常用API:

在这里插入图片描述

LocalDate start = LocalDate.of(2022,12,3);
LocalDate end = LocalDate.of(2023,12,1);
Period period = Period.between(start,end);
System.out.println("两个时间之间的差值  年:"+period.getYears()+",月:"+period.getMonths()+",日:"+period.getDays());

结果:
两个时间之间的差值  年:0,月:11,日:28

ChronoUnit也可以计算两个单元之间的天数、月数或年数。

LocalDate start = LocalDate.of(2022,12,3);
LocalDate end = LocalDate.of(2023,12,1);
long day = ChronoUnit.DAYS.between(start , end );
System.out.println("相差天数:" + day);
long month= ChronoUnit.MONTHS.between(start , end );
System.out.println("相差月数:" + month);
long year= ChronoUnit.YEARS.between(start , end );
System.out.println("相差年数:" + year);

// 结果:
相差天数:363
相差月数:11
相差年数:0

四、获取指定日期

java.util.Date类

下面仅以部分日期为例,其他单位(年、月、日、1/2 日、时等等)大同小异。

//一周后的日期
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
Calendar ca = Calendar.getInstance();
ca.add(Calendar.DATE, 7);
Date d = ca.getTime();
String after = formatDate.format(d);
System.out.println("当前日期:" + formatDate.format(new Date()));
System.out.println("一周后日期:" + after);
//当前日期:2023-08-26
//一周后日期:2023-09-02

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//获取当前月第一天:
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
String first = format.format(c.getTime());
System.out.println("first day:" + first);

//获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(ca.getTime());
System.out.println("last day:" + last);

//当年最后一天
Calendar currCal = Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, currCal.get(Calendar.YEAR));
calendar.roll(Calendar.DAY_OF_YEAR, -1);
Date time = calendar.getTime();
System.out.println("last day:" + format.format(time));

//first day:2023-08-01
//last day:2023-08-31
//last day:2023-12-31

java.time.LocalDate类

下面仅以部分日期为例,其他单位(年、月、日、1/2 日、时等等)大同小异。另外,这些单位都在 java.time.temporal.ChronoUnit 枚举中定义。

//一周后的日期
LocalDate localDate = LocalDate.now();
//方法1
LocalDate after = localDate.plus(1, ChronoUnit.WEEKS);
//方法2
LocalDate after2 = localDate.plusWeeks(1);
System.out.println("一周后日期:" + after);
System.out.println("一周后日期:" + after2);
//一周后日期:2023-09-02
//一周后日期:2023-09-02

LocalDate today = LocalDate.now();
//获取当前月第一天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
// 取本月最后一天
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
//取下一天:
LocalDate nextDay = lastDayOfThisMonth.plusDays(1);
//当年最后一天
LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfYear());
//2023年最后一个周日
LocalDate lastMondayOf2021 = LocalDate.parse("2023-12-31").with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));

五、时区

java.util.Date类

java.util.Date 对象实质上存的是 1970 年 1 月 1 日 0 点( GMT)至 Date 对象所表示时刻所经过的毫秒数。也就是说不管在哪个时区 new Date,它记录的毫秒数都一样,和时区无关。但在使用上应该把它转换成当地时间,这就涉及到了时间的国际化。
java.util.Date 本身并不支持国际化,需要借助 TimeZone。

// 北京时间:Sat Aug 26 14:52:29 CST 2023
Date date = new Date();

SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 北京时区
bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println("毫秒数:" + date.getTime() + ", 北京时间:" + bjSdf.format(date));
// 东京时区
SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));  // 设置东京时区
System.out.println("毫秒数:" + date.getTime() + ", 东京时间:" + tokyoSdf.format(date));
// 如果直接print会自动转成当前时区的时间
System.out.println(date);

//毫秒数:1693032749431, 北京时间:2023-08-26 14:52:29
//毫秒数:1693032749431, 东京时间:2023-08-26 15:52:29
//Sat Aug 26 14:52:29 CST 2023

ZonedDateTime类

Java8引入了java.time.ZonedDateTime 来表示带时区的时间。它可以看成是 LocalDateTime + ZoneId。

//当前时区时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前时区时间: " + zonedDateTime);

//东京时间
ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("JST"));
ZonedDateTime tokyoTime = zonedDateTime.withZoneSameInstant(zoneId);
System.out.println("东京时间: " + tokyoTime);

// ZonedDateTime 转 LocalDateTime
LocalDateTime localDateTime = tokyoTime.toLocalDateTime();
System.out.println("东京时间转当地时间: " + localDateTime);

//LocalDateTime 转 ZonedDateTime
ZonedDateTime localZoned = localDateTime.atZone(ZoneId.systemDefault());
System.out.println("本地时区时间: " + localZoned);

当前时区时间: 2023-08-26T14:55:47.669+08:00[Asia/Shanghai]
东京时间: 2023-08-26T15:55:47.669+09:00[Asia/Tokyo]
东京时间转当地时间: 2023-08-26T15:55:47.669
本地时区时间: 2023-08-26T15:55:47.669+08:00[Asia/Shanghai]

后续遇到常用的API会继续补充。。。

好了,看到了这里觉得有用的朋友们点个赞吧,博主整理资料还是很累的,需要一点正反馈。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/932395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch - 海量数据索引拆分的一些思考

文章目录 困难解决方案初始方案及存在的问题segment merge引入预排序 拆分方案设计考量点如何去除冗余数据按什么维度拆分,拆多少个最终的索引拆分模型演进历程整体迁移流程全量迁移流程流量回放比对验证异步转同步多索引联查优化效果 总结与思考参考 困难 索引数据…

DaVinci Resolve(达芬奇)软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 DaVinci Resolve是一款专业的影视后期制作软件,被广泛应用于电影、电视剧、广告、纪录片等影视制作领域。它提供了全面的后期制作工具,包括色彩校正、颜色分级、视觉效果处理、音频处理等,能够…

【前端工程化】万字拆解package.json (一)

什么是package package 指拥有 package.json 的一个文件夹(或压缩包),而 package 的属性就是 package.json 文件的内容,比如: name:这个包叫什么名字,唯一version:这个包的版本号是…

第三方检测检验实验室信息化建设

检测公司配置先进的信息化管理系统,信息化管理系统采用适宜的、先进的架构,具备开放性、扩展性、前瞻性、安全性等。先期建设按照实验室的规格及整体配套设施,整个实验室信息化系统的结构化数据考虑本地存储,且应考虑高速存储应用…

python3GUI--模仿一些b站网页端组件By:PyQt5(详细介绍、附下载地址)

文章目录 一.前言二.展示1.banner1.静图2.动图 2.一般视频组件1.静图2.动图 3.排行榜1.静图2.动图 三.设计心得(顺序由简到难)1.排行榜2.一般视频组件3.banner 四.总结五.下载地址 一.前言 播客二连发&…

React Hooks 全解:零基础入门

Hooks 的由来 你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? ——拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function。 你还在为搞不清使用哪个生命周期钩…

RT-Thread 线程间同步

多个执行单元(线程、中断)同时执行临界区,操作临界资源,会导致竟态产生。 RTT使用信号量、互斥量、事件集来解决这种问题。 同步(按顺序)、互斥(排它)。 信号量 信号量是一种轻型…

Adobe Media Encoder软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe Media Encoder是一款由Adobe公司开发的视频和音频后期制作软件,它集成了多种编码格式和输出选项,可以帮助用户将视频和音频文件转换成适合各种用途的格式。该软件可以与Adobe Premiere Pro、After …

使用delphi XE10.3.2 开发linux 上的Daemon

delphi 10.3.2支持linux, 而且官方只是支持命令行编程,目地就是做linux 服务器端的开发。 既然是做linux服务器端的开发,那么普通的命令行运行程序,然后等待开一个黑窗口的方式就 太low了(目前就有个别语言大咖,经常在Windows 上开个黑窗口,看起来非常恶心),那么如果…

HTML+CSS 查漏补缺

目录 1,HTML1,尺寸的百分比1,普通元素2,绝对(固定)定位元素3,常见百分比 2,form 表单元素1,form2,button3,label4,outline5&#xff0…

Vue2向Vue3过度Vue3状态管理工具Pinia

目录 1. 什么是Pinia2. 手动添加Pinia到Vue项目3. Pinia基础使用4. getters实现5. action异步实现6. storeToRefs工具函数7. Pinia的调试8. Pinia持久化插件 1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到…

css之文字连续光影特效、动画、scss

文章目录 效果图htmlscsscss 效果图 html <div><span>C</span><span>O</span><span>L</span><span>O</span><span>R</span><span>F</span><span>U</span><span>L</span&…

Linux--进程地址空间

1.线程地址空间 所谓进程地址空间&#xff08;process address space&#xff09;&#xff0c;就是从进程的视角看到的地址空间&#xff0c;是进程运行时所用到的虚拟地址的集合。 简单地说&#xff0c;进程就是内核数据结构和代码和本身的代码和数据&#xff0c;进程本身不能…

MybatisPlus(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 MyBatis-Plus&#xff08;简称MP&#xff09;是一个 Mybatis 的增强工具&…

【PHP】面向对象相关概念

文章目录 面向对象概念关键字说明关于类类成员访问修饰限定符类内部对象-this对象开发规范构造方法析构方法对象传值范围解析操作符&#xff08;类常量访问&#xff09;静态成员self关键字对象克隆 面向对象高级封装继承多态 面向对象概念 面向对象编程也叫做OOP编程&#xff…

时间和日期--Python

1. 时间&#xff1a;time模块 总结&#xff1a;2. datetime模块 相比与time模块&#xff0c;datetime模块的接口更直观、更容易调用 2.1 datetime模块定义的类 &#xff08;1&#xff09;datetime.date:表示日期的类。常用的属性有&#xff1a;year、month、day; &#xff…

【C++】C++ 引用详解 ④ ( 函数返回 静态变量 / 全局变量 的 引用 / 指针 )

文章目录 一、函数返回 静态变量 / 全局变量 的 引用 / 指针1、函数返回局部变量引用或指针无意义2、函数返回静态变量/全局变量的引用或指针3、代码示例 - 函数返回静态变量/全局变量的引用或指针 一、函数返回 静态变量 / 全局变量 的 引用 / 指针 1、函数返回局部变量引用或…

【多线程】Thread类的用法

文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…

使用CSS的@media screen 规则为不同的屏幕尺寸设置不同的样式(响应式图片布局)

当你想要在不同的屏幕尺寸或设备上应用不同的CSS样式时&#xff0c;可以使用 media 规则&#xff0c;特别是 media screen 规则。这允许你根据不同的屏幕特性&#xff0c;如宽度、高度、方向等&#xff0c;为不同的屏幕尺寸设置不同的样式。 具体来说&#xff0c;media screen…