从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!

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


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

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在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类有多个构造函数,其中比较常用的是以下两个:

java 复制代码
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()方法可以将日期时间按照指定的格式进行格式化。例如:

java 复制代码
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对象。例如:

java 复制代码
    //解析日期时间
    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()方法可以设置时区。例如:

java 复制代码
    //设置区时
    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类支持使用转义字符来输出特殊字符。例如:

java 复制代码
    //转义字符
    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补全。例如:

java 复制代码
    //数字格式化
    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"等,分别表示小时、分钟、秒、毫秒等。例如:

java 复制代码
    //格式化模式
    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类的示例代码及测试用例:

java 复制代码
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类的用法,进而更加灵活地进行日期时间的处理。

☀️建议/推荐你

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

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


相关推荐
rzl024 分钟前
java web5(黑马)
java·开发语言·前端
君爱学习10 分钟前
RocketMQ延迟消息是如何实现的?
后端
guojl24 分钟前
深度解读jdk8 HashMap设计与源码
java
Falling4227 分钟前
使用 CNB 构建并部署maven项目
后端
guojl29 分钟前
深度解读jdk8 ConcurrentHashMap设计与源码
java
程序员小假38 分钟前
我们来讲一讲 ConcurrentHashMap
后端
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言
萧曵 丶1 小时前
Rust 中的返回类型
开发语言·后端·rust