想让你的代码简洁,试试这个SimpleDateFormat类高深用法
本文分享自华为云社区《从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!》,作者:bug菌。
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
@[toc]
前言
日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在Java中,我们可以使用SimpleDateFormat类来方便地进行日期时间的格式化和解析操作。
本文将介绍SimpleDateFormat类的高深用法,旨在让读者更好地掌握该类的用法,让代码更加简洁。
摘要
本文中,我们将会介绍以下几个方面:
SimpleDateFormat类的概述和常见用法SimpleDateFormat类高深用法- 代码实现及测试用例
- 小结和总结
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类对日期进行格式化和解析,具体介绍如下:
格式化日期时间
使用SimpleDateFormat的format()方法对当前时间进行格式化,将时间按照指定的格式输出。
解析日期时间
使用SimpleDateFormat的parse()方法将字符串转换成Date类型的日期。
设置时区
使用SimpleDateFormat的setTimeZone()方法设置时区,将默认的时区改成GMT+8。
转义字符
使用单引号和双引号将字符括起来,表示这部分内容不需要进行格式化。
数字格式化
在格式化日期中增加毫秒级别的时间。
格式化模式
使用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类的用法,进而更加灵活地进行日期时间的处理。
想让你的代码简洁,试试这个SimpleDateFormat类高深用法的更多相关文章
- 标准代码书写 C++ 的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果 离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是 ...
- JavaScript 代码简洁之道
摘要: 可以说是<Clean Code>的JS代码示例了,值得参考. 原文:JavaScript 代码简洁之道 作者:缪宇 Fundebug经授权转载,版权归原作者所有. 测试代码质量的唯 ...
- 代码简洁的滑动门(tab)jquery插件
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org ...
- 【前端模板之路】一、重构的兄弟说:我才不想看你的代码!把HTML给我交出来!
写在前面 随着前端领域的发展和社会化分工的需要,继前端攻城湿之后,又一重要岗位横空出世——重构攻城湿!所谓的重构攻城湿,他们的一大特点之一,就是精通CSS配置文件的编写...前端攻城湿跟重构攻城湿是一 ...
- (转)【前端模板之路】一、重构的兄弟说:我才不想看你的代码!把HTML给我交出来!
原文地址:http://www.cnblogs.com/chyingp/archive/2013/06/30/front-end-tmplate-start.html 写在前面 随着前端领域的发展和社 ...
- JAVA基础之代码简洁之道
引言 普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.--来自网络 背景 软件质量,不但依赖于架构及项目管理,更与 ...
- JDK新特性——Stream代码简洁之道的详细用法
一.概述 Stream 是一组用来处理数组.集合的API,Stream API 提供了一种高效且易于使用的处理数据的方式. Java 8 中之所以费这么大的功夫引入 函数式编程 ,原因有两个: 代码简 ...
- java代码行数统计工具类
package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...
- Java之同步代码块处理继承Thread类的线程安全问题
package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...
- 《Clean Code》 代码简洁之道
作者介绍 原文作者: Robert C. Martin, Object Mentor公司总裁,面向对象设计.模式.UML.敏捷方法学和极限编程领域的资深顾问,是<敏捷软件开发:原则.模式.与实践 ...
随机推荐
- 盘点!国内隐私计算学者在 USENIX Security 2023 顶会上的成果
USENIX Security 是国际公认的网络安全与隐私计算领域的四大顶级学术会议之一.CCF(中国计算机学会) 推荐的 A 类会议. 每年的 USENIX Security 研讨会都会汇集大量研究 ...
- redis雪崩问题解决
缓存雪崩 出现的场景 缓存服务器宕机,没有设置持久化 介绍:缓存服务器宕机,没有设置持久化,导致缓存数据全部丢失,请求全部转发到数据库,造成数据库短时间内承受大量请求而崩掉. 缓存集中失效 缓存的ke ...
- C# 12新预览功能介绍
Visual Studio 17.7 Preview 3和.NET 8 Preview 6延续了C# 12的发展.该预览版包含的功能旨在为未来的性能增强奠定基础.对内联数组的轻松访问将允许库在更多地方 ...
- Redis从入门到放弃(3):发布与订阅
1.介绍 Redis是一个快速.开源的内存数据库,支持多种数据结构,如字符串.哈希.列表.集合.有序集合等.除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(Pub ...
- Go 语言 select 都能做什么?
原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作. 通过 select 语句,我们可以同时监听多个 ch ...
- pandas:字典转dataframe的注意事项
推荐写法 参考链接 https://blog.csdn.net/u013061183/article/details/79497254
- openpyxl 统一表格样式
# 统一表格样式 rows = ws.max_row columns = ws.max_column # print(rows) # print(columns) for row in range(1 ...
- 解决 Blazor 中因标签换行导致的行内元素空隙问题
实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做"适配",在 Blazor 上也不例外.在做 Ant Design Blazor 时就深 ...
- Hugging News #0807: ChatUI 官方 Docker 模板发布、🤗 Hub 和开源生态介绍视频来啦!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 数仓备份经验分享丨详解roach备份原理及问题处理套路
本文分享自华为云社区<GaussDB(DWS) 备份问题定位思路>,作者: yd_216390446. 前言 在数据库系统中,故障分为事务内部故障.系统故障.介质(磁盘)故障.对于事务内部 ...