想让你的代码简洁,试试这个 SimpleDateFormat 类高深用法

(给ImportNew加星标,提高Java技能)


前言


日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在 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()方法对当前时间进行格式化,将时间按照指定的格式输出。
2. 解析日期时间

使用SimpleDateFormat的parse()方法将字符串转换成Date类型的日期。
3. 设置时区

使用SimpleDateFormat的setTimeZone()方法设置时区,将默认的时区改成GMT+8。
4. 转义字符

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

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

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

测试执行


输出结果如下所示:
2023-10-17 19:31:16Tue Oct 17 00:00:00 CST 20232023-10-17 19:31:162023-10-17 at 19:31:162023/10/17 19:31:16.7832023-10-17 星期二 19:31:16

执行结果截图如下:



小结


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


附录源码


如上涉及所有源码均已上传同步在 Gitee:

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


总结


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


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


转自:bug菌 / 华为云社区,

链接:blog.csdn.net/devcloud/article/details/133931981



- EOF -

推荐阅读  点击标题可跳转

1、Java SimpleDateFormat 没那么简单

2、SimpleDateFormat 线程安全问题的六种解决方案

3、MySQL 由于 Java 日期 LocalDateTime 数据精度引发的线上问题


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

点赞和在看就是最大的支持❤️


相关推荐

  • 代码是上午写的,人是下午被开除的
  • 猛肝195篇论文,我觉得多模态才是未来
  • 卧槽!红警源代码居然开源了
  • vivo 将发布全球首款基于 Rust 编写的操作系统;Windows 11 更新,含 AI 助手 Copilot|极客头条
  • 从斯坦福小镇到病娇猫娘,AI大模型正在颠覆游戏行业
  • Java实现图片转文字!
  • AI创业:不思考趋势,就会被GPT5折叠
  • 什么样的后端开发,会被公司抢着要?
  • 注解方式优雅的实现 Redisson 分布式锁
  • Java 17 与 Java 11:探索最新功能,为什么我强烈建议你升级到 Java 17?
  • 如何让你的Node.js应用程序处理数百万的API请求
  • Spring Boot整合阿里云OSS文件上传
  • 面试居然碰到了前女友,真的人都麻了
  • hippo - 提升我们团队工程效率的工具
  • 2024年,Rust 与 JavaScript 的较量!谁将成为编程领域的新王者?
  • 阿里家属:程序员老公10年薪资变化,从12年月薪三千到现在年入百万以上
  • 纯CSS实现跑马灯效果,CSS动画知识是该补一补了~
  • 开源 2 年、打磨 13 年、300 万行代码的开源项目
  • 分享一位27岁的前端,从二本到澳洲🦘的故事
  • 分享7个有用的Node.js库,让你事半功倍