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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【6月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

在这里插入图片描述

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


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

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
AI 代码解读

@[toc]

前言

  日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在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)
AI 代码解读

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

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();
    }
}
AI 代码解读

  上述代码将当前时间格式化为"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();
    }
AI 代码解读

  上述代码将字符串"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();
    }
AI 代码解读

  上述代码设置时区为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();
    }
AI 代码解读

  上述代码使用单引号将"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();
    }
AI 代码解读

  上述代码将当前时间格式化为"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();
    }
AI 代码解读

  上述代码将当前时间格式化为"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);
    }
}
AI 代码解读

代码解析

  针对如上的测试用例代码,给大家演示了如何使用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编程,就像滚雪球一样,越滚越大,指数级提升。

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


目录
打赏
0
1
1
0
207
分享
相关文章
|
21天前
|
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
47 0
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
37 5
|
21天前
|
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
29 1
|
18天前
|
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
java系列知识之~SimpleDateFormat日期格式化
这篇文章介绍了Java中`SimpleDateFormat`类的使用,包括如何创建实例、格式化日期对象为字符串、解析字符串为日期对象,并提供了常见日期模式和使用示例,同时指出了`SimpleDateFormat`不是线程安全及其它一些注意事项。
【JavaSE专栏43】Java常用类SimpleDateFormat解析,轻松解决日期格式化问题
【JavaSE专栏43】Java常用类SimpleDateFormat解析,轻松解决日期格式化问题
223 0
Java SimpleDateFormat进行日期格式化
本文目录 1. 为啥要用SimpleDateFormat 2. 日期格式化显示 3. 将字符串转换为对应日期
215 0
Java SimpleDateFormat进行日期格式化
|
2月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
182 60
【Java并发】【线程池】带你从0-1入门线程池
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
80 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等