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

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

在这里插入图片描述

一、日期格式化和解析

java.util.Date类

格式化操作

public void oldFormat(){Date now = new Date();//format yyyy-MM-ddSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String date  = sdf.format(now);System.out.println(String.format("date format : %s", date));//format HH:mm:ssSimpleDateFormat 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:ssSimpleDateFormat 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-ddLocalDate date = LocalDate.now();System.out.println(String.format("date format : %s", date));//format HH:mm:ssLocalTime time = LocalTime.now().withNano(0);System.out.println(String.format("time format : %s", time));//format yyyy-MM-dd HH:mm:ssLocalDateTime 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-02SimpleDateFormat 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-02LocalDate 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.mzph.cn/news/53705.shtml

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

相关文章

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器,虽然性能会比云要来的差,但是不用每月交钱上。云服务固然方便,但是几个核的性能和一点存储,想做一个动漫网站固然要很多mp4这种影视资源,云服务器…

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基,这三个相辅相成又各有区别。 (1)数学以线性代数为主要研究工具和部分微积分技术为手…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1.CDN简介及工作流程 CDN(Content Delivery Network,内容分发网络)的目的是通过在现有的网络架构中增加一层新的Cache(缓存)层,将网站的内容发布到最接近用户的网…

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天,我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行,甚至崩溃。但是,请不要担心,我会为大家提供5种解决方法,帮助大家轻松解决问题。 首先,我们来看…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的? 蜂鸣器 是 一种 一体化结构 的电子训响器,可以发出声音的电子元器件 蜂鸣器分类? ①压电式蜂鸣器(图左) 称: 无源蜂鸣器 ②电磁式蜂鸣器(图右) 称&#xf…

陪诊系统源码开发:实现个性化医疗陪护的创新之路

陪诊系统的源码开发在现代医疗中具有重要意义。本文将通过代码示例介绍陪诊系统的源码开发,展示如何实现个性化医疗陪护的创新方案。 1. 安装和环境设置: 首先,确保你的开发环境中已经安装了合适的编程语言和框架,比如Python和…

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展,小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说,开发一款定制化的小程序不仅可以提升服务效率,还可以增强品牌形象和用户粘性。那么,如何定制开发人力资源类的小程序呢?下面…

使用Miniconda

Conda是一个开源的包和环境管理器,使用它可以在同一台机器上安装不同版本的Python软件包和依赖了。Anaconda和Miniconda都集成了Conda,Anaconda包括更多的工具包,Miniconda则只包括Conda和Python。 在很奇葩的Deepin下Miniconda安装之旅 中,…

8路光栅尺磁栅尺编码器或16路高速DI脉冲信号转Modbus TCP网络模块 YL99-RJ45

特点: ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数,频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数,可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

探讨uniapp的组件使用的问题

1 view Flex是Flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性。 当设置display: flex后,继续给view等容器组件设置flex-direction:row或column,就可以在该容器内按行或列排布子组件。uni-app推荐使用flex布…

LeetCode——有效的括号

这里,我提供一种用栈来解决的方法: 思路:栈的结构是先进后出,这样我们就可以模拟栈结构了,如果是‘(’、‘{’、‘[’任何一种,直接push进栈就可以了,如果是‘}’、‘)’…

Windows部署SQL Server-开发者版

一、简介 SQL Server 开发者版本,是一个为开发人员准备的版本。它是免费的,但不能在生产中使用它。它包含所有 SQL Server 企业版的功能,但不能在生产中部署,是一个用于非生产环境的免费版本。 二、下载 访问 https://www.mic…

Zabbix监控系统最新版安装

setenforce 0 设置SELinux 成为permissive模式 临时关闭selinux的 [rootwww yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo % Total % Received % Xferd Average Speed Time Time Time Current …

家长如何将ChatGPT成为家庭日常活动的得力助手

人工智能已经在许多领域发挥作用,如播放音乐、关闭灯光和帮助我们更安全地驾驶。那么,在养育孩子方面呢? 使用像ChatGPT这样的应用,家长们可以更好地完成任务,但同时也要了解其中存在的风险。 许多家长表示&#xff…

mall:redis项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Redis 非关系型数据库2.1 Redis简介2.2 分布式后端项目的使用流程2.3 分布式后端项目的使用场景2.4 常见的缓存问题 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置3.1.3 全局跨域配置 3.2 Redis测试…

java并发:synchronized锁详解

背景: 在java多线程当中,我们总有遇到过多个线程操作一个共享数据时,而这个最后的代码执行结果并没有按照我们的预期一样得到正确的结果。此时我们就需要让代码执行在操作共享变量时,要等一个线程操作完毕时,另一个线程…

Python OCR 使用easyocr库将图片中的文章提取出来

Python OCR 使用easyocr库将图片中的文章提取出来 初环境内容步骤一:安装easyocr库步骤二:导入必要的库步骤三:创建OCR阅读器对象步骤四:指定要识别的图片路径步骤五:执行OCR识别并提取文章内容步骤六:遍历…

记录protocol buffers Mac安装

使用brew安装最新的protobuf 在Mac 上安装,使用brew 可以安装最新的protobuf。这个也比较简单,简单说一下。 首先先检查一下是否安装了brew。如果没有安装brew的话,请先安装brew.可以通过brew --version来检查 使用brew install protobuf 来…

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统,“银河麒麟V10”, 在我电脑本机vmware 15的虚拟机中进行安装测试; 1.点击这里提交产品试用申请,不过只需要随便输入,手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…