⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/devcloud/article/details/133931981 「bug菌 / 华为云社区」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前言

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

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

摘要

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

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

一、SimpleDateFormat 类

概述

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

优缺点

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

优点:

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

缺点:

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

应用场景

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. 格式化日期时间

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

  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:

https://gitee.com/bugjun01/snowball-learning-java

总结

总的来说,本文介绍了 Java 中常用的日期格式化和解析类 SimpleDateFormat 的概述、常见用法和高深用法,以及使用该类的测试用例和代码实现。其中,常见用法包括格式化日期时间、解析日期时间和设置时区,而高深用法则包括转义字符、数字格式化和格式化模式等。

此外,本文还提到了 SimpleDateFormat 的优缺点和应用场景。需要注意的是,由于 SimpleDateFormat 是线程不安全的类,在多线程环境中需要进行同步处理,或者使用线程安全的替代品。通过学习本文,读者可以更好地掌握 SimpleDateFormat 类的用法,进而更加灵活地进行日期时间的处理。

文章目录
  1. 1. 前言
  2. 2. 摘要
  3. 3. 一、SimpleDateFormat 类
    1. 3.0.1. 概述
    2. 3.0.2. 优缺点
      1. 3.0.2.1. 优点:
      2. 3.0.2.2. 缺点:
    3. 3.0.3. 应用场景
    4. 3.0.4. 源码分析
      1. 3.0.4.1. 1. 构造函数
      2. 3.0.4.2. 2.格式化时间
      3. 3.0.4.3. 3.解析时间
      4. 3.0.4.4. 4.线程安全
    5. 3.0.5. 常见用法
      1. 3.0.5.1. 1. 格式化日期时间
      2. 3.0.5.2. 2. 解析日期时间
      3. 3.0.5.3. 3. 设置时区
  • 4. 二、高深用法
    1. 4.0.0.1. 1. 转义字符
    2. 4.0.0.2. 2. 数字格式化
    3. 4.0.0.3. 3. 格式化模式
  • 5. 三、测试用例
    1. 5.0.0.1. 代码示例
    2. 5.0.0.2. 代码解析
    3. 5.0.0.3. 测试执行
  • 5.0.1. 小结
  • 6. 总结