滚雪球学Java(53):从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • SimpleDateFormat类
    • 概述
    • 优缺点
      • 优点:
      • 缺点:
    • 应用场景
    • 源码分析
      • 1.构造函数
      • 2.格式化时间
      • 3.解析时间
      • 4.线程安全
    • 常见用法
      • 1. 格式化日期时间
      • 2. 解析日期时间
      • 3. 设置时区
    • 高深用法
      • 1. 转义字符
      • 2. 数字格式化
      • 3. 格式化模式
    • 测试用例
      • 代码示例
      • 代码解析
      • 测试执行
    • 小结
    • 附录源码
  • 总结
  • ☀️建议/推荐你
  • 📣关于我

前言

  日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在Java中,我们可以使用SimpleDateFormat类来方便地进行日期时间的格式化和解析操作。

  本文将介绍SimpleDateFormat类的高深用法,旨在让读者更好地掌握该类的用法,让代码更加简洁。

摘要

本文中,我们将会介绍以下几个方面:

  1. SimpleDateFormat类的概述和常见用法
  2. SimpleDateFormat类高深用法
  3. 代码实现及测试用例
  4. 小结和总结

SimpleDateFormat类

概述

  SimpleDateFormat类是Java中用于格式化和解析日期时间的类。它提供了一系列的构造方法和格式化字符串,使得我们能够方便地进行日期时间的格式化和解析。

优缺点

  SimpleDateFormat是Java中用于格式化日期和时间的类,它继承自DateFormat类,是线程不安全的类。

优点:

  1. 简单易用,可以快速地将日期格式化为指定的格式,并将字符串转换为对应的日期对象。
  2. 可以自定义日期格式,支持多种预定义的格式。
  3. 可以用于日期的解析和格式化操作。

缺点:

  1. SimpleDateFormat是线程不安全的,不适合在多线程环境中使用。
  2. 对于某些日期格式,如年月日时分秒毫秒,需要使用一些特定的字符表示,这些字符具有一定的难度和复杂性。

应用场景

  SimpleDateFormat适用于对日期进行格式化和解析的场景,如在日志记录、数据库操作、电子商务等领域中都有应用。例如,可以将时间戳转换为指定格式的日期字符串,也可以将日期字符串解析为对应的日期对象。但要注意,由于SimpleDateFormat线程不安全,需要在多线程环境中使用时进行同步处理,或者使用线程安全的替代品,如Joda-Time库中的DateTimeFormatter

源码分析

  SimpleDateFormat是Java中一个经典的时间格式化类,它可以将时间按照指定的格式转换为字符串,也可以将字符串按照指定的格式转换为时间。

  其中对于SimpleDateFormat类源码比较复杂,因为它涉及了很多的时间格式化规则。在这里,我们只简单分析它的实现原理。

1.构造函数

  SimpleDateFormat类有多个构造函数,其中比较常用的是以下两个:

public SimpleDateFormat(String pattern)
public SimpleDateFormat(String pattern, Locale locale)

  第一个构造函数的参数是时间格式化的模板,即时间字符串的格式。第二个构造函数可以指定地理位置信息。

2.格式化时间

  SimpleDateFormat类将时间格式化为字符串的主要方法是format(),该方法接收一个Date类型的参数,返回一个格式化后的时间字符串。

3.解析时间

  SimpleDateFormat类将字符串解析为时间的主要方法是parse(),该方法接收一个时间字符串作为参数,返回一个Date类型的日期对象。

4.线程安全

  SimpleDateFormat类不是线程安全的,因为它的内部状态可以被多个线程同时修改。如果要在多线程环境下使用它,可以使用ThreadLocal来实现线程隔离。

  总的来说,SimpleDateFormat类是Java中一个非常常用的时间格式化类,可以方便地将时间转换为指定格式的字符串,也可以将字符串解析为时间。在使用时,应该注意其线程安全性。

常见用法

以下是SimpleDateFormat类的几个常见用法:

1. 格式化日期时间

  SimpleDateFormat类的format()方法可以将日期时间按照指定的格式进行格式化。例如:

package com.demo.javase.day53;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author bug菌* @date 2023/10/17 19:17*/
public class SimpleDateFormatTest {//格式化日期时间public static void testFormat(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStr = sdf.format(new Date());System.out.println(dateStr);}public static void main(String[] args) {testFormat();}
}

  上述代码将当前时间格式化为"yyyy-MM-dd HH:mm:ss"的格式后输出。

输出结果如下所示:

2023-10-17 19:21:45

执行结果截图如下:

在这里插入图片描述

2. 解析日期时间

  SimpleDateFormat类的parse()方法可以将特定格式的字符串解析成Date对象。例如:

    //解析日期时间public static void testParse() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse("2023-10-17");System.out.println(date);}public static void main(String[] args) throws ParseException {testParse();}

  上述代码将字符串"2021-08-01"解析成Date对象后输出。输出结果如下所示:

Tue Oct 17 00:00:00 CST 2023

执行结果截图如下:

在这里插入图片描述

3. 设置时区

  SimpleDateFormat类的setTimeZone()方法可以设置时区。例如:

    //设置区时public static void testSetTimeZone(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));String dateStr = sdf.format(new Date());System.out.println(dateStr);}public static void main(String[] args) throws ParseException {testSetTimeZone();}

  上述代码设置时区为GMT+8后将当前时间格式化为"yyyy-MM-dd HH:mm:ss"的格式输出。输出结果如下所示:

2023-10-17 19:25:43

执行结果截图如下:

在这里插入图片描述

高深用法

  除了以上的常见用法外,SimpleDateFormat类还有一些高级用法,可以让我们更加灵活地进行日期时间的格式化和解析。

1. 转义字符

  SimpleDateFormat类支持使用转义字符来输出特殊字符。例如:

    //转义字符public static void testSimpleDateFormat(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss");String dateStr = sdf.format(new Date());System.out.println(dateStr);}public static void main(String[] args) throws ParseException {testSimpleDateFormat();}

  上述代码使用单引号将"at"括起来,表示输出字符"at"。输出结果如下所示:

2023-10-17 at 19:27:24

执行结果截图如下:

在这里插入图片描述

2. 数字格式化

  SimpleDateFormat类支持使用"#“和"0"来进行数字格式化。其中,”#"表示可选数字,"0"表示不足位数用0补全。例如:

    //数字格式化public static void testSimpleDateFormat_1(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");String dateStr = sdf.format(new Date());System.out.println(dateStr);}public static void main(String[] args) throws ParseException {testSimpleDateFormat_1();}

  上述代码将当前时间格式化为"yyyy-MM-dd HH:mm:ss.SSS"的格式后输出。输出结果如下所示:

2023-10-17 19:28:31.478

执行结果截图如下:

在这里插入图片描述

3. 格式化模式

  SimpleDateFormat类支持使用格式化模式来输出日期时间。格式化模式由日期和时间组成,可以自由组合。日期格式化模式包括"y"、“M”、“d”、“E"等,分别表示年、月、日、星期几等。时间格式化模式包括"H”、“m”、“s”、"S"等,分别表示小时、分钟、秒、毫秒等。例如:

    //格式化模式public static void testSimpleDateFormat_2() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");String dateStr = sdf.format(new Date());System.out.println(dateStr);}public static void main(String[] args) throws ParseException {testSimpleDateFormat_2();}

  上述代码将当前时间格式化为"yyyy-MM-dd E HH:mm:ss"的格式后输出。输出结果如下所示:

2023-10-17 星期二 19:29:42

执行结果截图如下:

在这里插入图片描述

测试用例

代码示例

以下是使用SimpleDateFormat类的示例代码及测试用例:

package com.demo.javase.day53;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;/*** @author bug菌* @date 2023/10/17 19:17*/
public class SimpleDateFormatDemo {public static void main(String[] args) throws Exception {// 格式化日期时间SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStr1 = sdf1.format(new Date());System.out.println(dateStr1);// 解析日期时间SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");Date date2 = sdf2.parse("2023-10-17");System.out.println(date2);// 设置时区SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf3.setTimeZone(TimeZone.getTimeZone("GMT+8"));String dateStr3 = sdf3.format(new Date());System.out.println(dateStr3);// 转义字符SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss");String dateStr4 = sdf4.format(new Date());System.out.println(dateStr4);// 数字格式化SimpleDateFormat sdf5 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");String dateStr5 = sdf5.format(new Date());System.out.println(dateStr5);// 格式化模式SimpleDateFormat sdf6 = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");String dateStr6 = sdf6.format(new Date());System.out.println(dateStr6);}
}

代码解析

  针对如上的测试用例代码,给大家演示了如何使用Java中的SimpleDateFormat类对日期进行格式化和解析,具体介绍如下:

  1. 格式化日期时间

  使用SimpleDateFormatformat()方法对当前时间进行格式化,将时间按照指定的格式输出。

  1. 解析日期时间

  使用SimpleDateFormat的parse()方法将字符串转换成Date类型的日期。

  1. 设置时区

  使用SimpleDateFormat的setTimeZone()方法设置时区,将默认的时区改成GMT+8。

  1. 转义字符

  使用单引号和双引号将字符括起来,表示这部分内容不需要进行格式化。

  1. 数字格式化

  在格式化日期中增加毫秒级别的时间。

  1. 格式化模式

  使用SimpleDateFormat定义格式化模式,按照指定的格式输出日期、星期几和时间。

  总的来说,SimpleDateFormat非常适合处理常规日期格式的转换和简单日期计算。但是需要注意的是它不是线程安全的,如果在多线程环境下使用,需要进行同步处理,或者使用ThreadLocal来实现线程局部变量。

测试执行

输出结果如下所示:

2023-10-17 19:31:16
Tue Oct 17 00:00:00 CST 2023
2023-10-17 19:31:16
2023-10-17 at 19:31:16
2023/10/17 19:31:16.783
2023-10-17 星期二 19:31:16\

执行结果截图如下:

在这里插入图片描述

小结

  本文向读者介绍了SimpleDateFormat类的概述和常见用法,以及一些高深用法。通过学习本文,读者可以更好地掌握SimpleDateFormat类的用法,让代码更加简洁。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

  总的来说,本文介绍了Java中常用的日期格式化和解析类SimpleDateFormat的概述、常见用法和高深用法,以及使用该类的测试用例和代码实现。其中,常见用法包括格式化日期时间、解析日期时间和设置时区,而高深用法则包括转义字符、数字格式化和格式化模式等。
  此外,本文还提到了SimpleDateFormat的优缺点和应用场景。需要注意的是,由于SimpleDateFormat是线程不安全的类,在多线程环境中需要进行同步处理,或者使用线程安全的替代品。通过学习本文,读者可以更好地掌握SimpleDateFormat类的用法,进而更加灵活地进行日期时间的处理。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

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

相关文章

STM32如何使用中断?

一:EXTI 简介 STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。 EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升 沿触…

易点易动设备管理系统:提升生产企业设备保养效率的利器

在现代生产企业中,设备保养是确保生产线稳定运行和产品质量的关键环节。然而,传统的设备保养方式往往面临效率低下、数据不准确等问题,影响了生产效率和竞争力。随着科技的进步,易点易动设备管理系统应运而生,以其智能…

【学一点儿前端】ajax、axios和fetch的概念、区别和易混淆点

省流读法 ajax是js异步技术的术语,早期相关的api是xhr,它是一个术语。 fetch是es6新增的用于网络请求标准api,它是一个api。 axios是用于网络请求的第三方库,它是一个库。 1.Ajax 它的全称是:Asynchronous JavaScri…

核酸管外观缺陷检测(一)

1.1 应用示例思路 (1) 对核酸管图像进行灰度化、阈值分割和连通域分析; (2) 筛选出待检测的区域,并对该区域进行变换校正; (3) 进一步获取待检测的ROI区域,并根据几何特征和阈值条件,来对核酸管外观进行检测&#x…

Windows10 Docker 安装教程

Docker Desktop是什么? Docker Desktop是适用于Windows的Docker桌面,是Docker设计用于在Windows 10上运行。它是一个本地 Windows 应用程序,为构建、交付和运行dockerized应用程序提供易于使用的开发环境。Docker Desktop for Windows 使用 …

Cron表达式每月20号晚18点执行

Cron表达式每月20号晚18点执行 0 0 18 20 * ?验证正确性

node.js的版本管理nvm

一、nvm是什么? nvm是一个node的版本管理工具,可以简单操作node版本的切换、安装、查看等等,与npm不同的是,npm是依赖包的管理工具。 二、nvm的安装 1.下载 2.安装 安装后的目录:C:\Users\admin\AppData\Roaming\nv…

Double 4 VR智能互动教学系统的教学应用

1. 激发学习兴趣 Double 4 VR智能互动教学系统通过虚拟现实技术为学生创造了一个身临其境的学习环境。学生可以通过戴上VR头盔,进入虚拟世界中与教学内容互动。这种沉浸式的学习方式能够激发学生的学习兴趣,使他们更加主动地参与到课堂中来。 2. 提供直…

DSP移相控制

//############################################################################################### // Description: // program for 4路PWM信号,每路以A为准,B与之互补,带死区。移相以第一路信号(EPWM1A)为基准…

Java10年技术架构演进

一、前言 又快到了1024,现代人都喜欢以日期的特殊含义来纪念属于自己的节日。虽然有点牵强,但是做件事情,中国人总喜欢找个节日来纪念,程序员也是一样。甚至连1111被定义成光棍节,这也算再无聊不过了。不过作为程序员…

报考阿里云acp认证,你得到的是什么?

放眼全球能够和亚马逊AWS、微软Azure竞争的,国内也就只有阿里云了。 阿里云目前稳居国内云计算市场第一,比排后面5名同行市场占有率的总和还要多,全球云计算市场,阿里云目前排名第3位。 阿里云的市场占有率说明市场对于阿里云产…

kafka、zookeeper、flink测试环境、docker

1、kafka环境单点 根据官网版本说明(3.6.0)发布,zookeeper依旧在使用状态,预期在4.0.0大版本的时候彻底抛弃zookeeper使用KRaft(Apache Kafka)官方并给出了zk迁移KR的文档 2、使用docker启动单点kafka 1、首先将kafka启动命令,存储为.servi…

小程序:uniapp解决主包体积过大的问题

已经分包但还是体积过大 运行时勾选“运行时是否压缩代码”进行压缩 在manifest.json配置(开启分包优化) "mp-weixin" : {"optimization" : {"subPackages" : true}//.... },在app.json配置(设置组件按需注入…

ubuntu 22.04修改永久修改 mac 地址

使用 rc-local.service rc-local.service 是系统自带的一个开机自启服务&#xff0c;但是在 ubuntu 20.04 上&#xff0c;该服务默认没有开启。 在文件的最后面添加 [Install] 段的内容&#xff0c; cat >> /lib/systemd/system/rc-local.service << EOF # SPD…

TCP通信-同时接受多个客户端消息

同时处理多个客户端消息的原理 代码实现 public class ClientDemo1 {public static void main(String[] args) {try {System.out.println("客户端启动");// 1、创建Socket通信管道请求有服务端的连接// public Socket(String host, int port)// 参数一&#xff1a;服…

现代 ERP 系统,如何使中小企业智能制造商受益?

中小企业智能制造商大多依靠手工操作或电子表格模式&#xff0c;或少数几个软件组成的集合体&#xff0c;或是依靠传统的ERP系统来管理企业运营。经营利润率低、订单到现金的周期缓慢、客户付款延迟、管理成本增加&#xff0c;使他们的生存变得更加困难。许多企业一直在以最少的…

视频模板SDK,为企业带来无限创意与效率

在当今的数字化时代&#xff0c;视频已经成为了信息传播的主流方式之一&#xff0c;对于企业来说&#xff0c;制作高质量的视频已经成为了一项重要的业务需求。然而&#xff0c;制作一部高质量的企业视频需要耗费大量时间和金钱&#xff0c;对于许多企业来说是一个不小的负担。…

Flask项目数据库配置、redis配置、session配置、csrf配置

1. 在app.py文件中 from datetime import timedelta from flask_wtf.csrf import CSRFProtect from flask import Flask, session from flask_sqlalchemy import SQLAlchemy from redis import StrictRedis from flask_session import Sessionapp Flask(__name__)class Confi…

软件测试基础知识整理(详细版)

一、软件测试概述 1、软件缺陷 软件缺陷&#xff1a;又称之为“Bug”。即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误&#xff0c;或者隐藏的功能缺陷。 缺陷的表现形式&#xff1a; 软件没有实现产品规格说明书所要求的功能模块&#xff1b; 软件中出现了产…

数据结构 优先级队列(堆)

数据结构 优先级队列(堆) 文章目录 数据结构 优先级队列(堆)1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现…