ToB企服应用市场:ToB评测及商务社交产业平台

标题: 想让你的代码简洁,试试这个SimpleDateFormat类高深用法 [打印本页]

作者: 张春    时间: 2023-11-9 06:24
标题: 想让你的代码简洁,试试这个SimpleDateFormat类高深用法
本文分享自华为云社区《从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!》,作者:bug菌。
  1. 环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
复制代码
@[toc]
前言

日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较等操作。在Java中,我们可以使用SimpleDateFormat类来方便地进行日期时间的格式化和解析操作。
本文将介绍SimpleDateFormat类的高深用法,旨在让读者更好地掌握该类的用法,让代码更加简洁。
摘要

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

概述

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

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

缺点:

应用场景

SimpleDateFormat适用于对日期进行格式化和解析的场景,如在日志记录、数据库操作、电子商务等领域中都有应用。例如,可以将时间戳转换为指定格式的日期字符串,也可以将日期字符串解析为对应的日期对象。但要注意,由于SimpleDateFormat线程不安全,需要在多线程环境中使用时进行同步处理,或者使用线程安全的替代品,如Joda-Time库中的DateTimeFormatter。
源码分析

SimpleDateFormat是Java中一个经典的时间格式化类,它可以将时间按照指定的格式转换为字符串,也可以将字符串按照指定的格式转换为时间。
其中对于SimpleDateFormat类源码比较复杂,因为它涉及了很多的时间格式化规则。在这里,我们只简单分析它的实现原理。
1.构造函数

SimpleDateFormat类有多个构造函数,其中比较常用的是以下两个:
  1. public SimpleDateFormat(String pattern)
  2. public SimpleDateFormat(String pattern, Locale locale)
复制代码
第一个构造函数的参数是时间格式化的模板,即时间字符串的格式。第二个构造函数可以指定地理位置信息。
2.格式化时间

SimpleDateFormat类将时间格式化为字符串的主要方法是format(),该方法接收一个Date类型的参数,返回一个格式化后的时间字符串。
3.解析时间

SimpleDateFormat类将字符串解析为时间的主要方法是parse(),该方法接收一个时间字符串作为参数,返回一个Date类型的日期对象。
4.线程安全

SimpleDateFormat类不是线程安全的,因为它的内部状态可以被多个线程同时修改。如果要在多线程环境下使用它,可以使用ThreadLocal来实现线程隔离。
总的来说,SimpleDateFormat类是Java中一个非常常用的时间格式化类,可以方便地将时间转换为指定格式的字符串,也可以将字符串解析为时间。在使用时,应该注意其线程安全性。
常见用法

以下是SimpleDateFormat类的几个常见用法:
1. 格式化日期时间

SimpleDateFormat类的format()方法可以将日期时间按照指定的格式进行格式化。例如:
  1. package com.demo.javase.day53;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. /**
  5. * @author bug菌
  6. * @date 2023/10/17 19:17
  7. */
  8. public class SimpleDateFormatTest {
  9.     //格式化日期时间
  10.     public static void testFormat(){
  11.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  12.         String dateStr = sdf.format(new Date());
  13.         System.out.println(dateStr);
  14.     }
  15.     public static void main(String[] args) {
  16.         testFormat();
  17.     }
  18. }
复制代码
上述代码将当前时间格式化为"yyyy-MM-dd HH:mm:ss"的格式后输出。
输出结果如下所示:
2023-10-17 19:21:45
执行结果截图如下:

2. 解析日期时间

SimpleDateFormat类的parse()方法可以将特定格式的字符串解析成Date对象。例如:
  1.     //解析日期时间
  2.     public static void testParse() throws ParseException {
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  4.         Date date = sdf.parse("2023-10-17");
  5.         System.out.println(date);
  6.     }
  7.     public static void main(String[] args) throws ParseException {
  8.         testParse();
  9.     }
复制代码
上述代码将字符串"2021-08-01"解析成Date对象后输出。输出结果如下所示:
Tue Oct 17 00:00:00 CST 2023
执行结果截图如下:

3. 设置时区

SimpleDateFormat类的setTimeZone()方法可以设置时区。例如:
  1.     //设置区时
  2.     public static void testSetTimeZone(){
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4.         sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  5.         String dateStr = sdf.format(new Date());
  6.         System.out.println(dateStr);
  7.     }
  8.     public static void main(String[] args) throws ParseException {
  9.         testSetTimeZone();
  10.     }
复制代码
上述代码设置时区为GMT+8后将当前时间格式化为"yyyy-MM-dd HH:mm:ss"的格式输出。输出结果如下所示:
2023-10-17 19:25:43
执行结果截图如下:

高深用法

除了以上的常见用法外,SimpleDateFormat类还有一些高级用法,可以让我们更加灵活地进行日期时间的格式化和解析。
1. 转义字符

SimpleDateFormat类支持使用转义字符来输出特殊字符。例如:
  1.     //转义字符
  2.     public static void testSimpleDateFormat(){
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss");
  4.         String dateStr = sdf.format(new Date());
  5.         System.out.println(dateStr);
  6.     }
  7.     public static void main(String[] args) throws ParseException {
  8.         testSimpleDateFormat();
  9.     }
复制代码
上述代码使用单引号将"at"括起来,表示输出字符"at"。输出结果如下所示:
2023-10-17 at 19:27:24
执行结果截图如下:

2. 数字格式化

SimpleDateFormat类支持使用"#“和"0"来进行数字格式化。其中,”#"表示可选数字,"0"表示不足位数用0补全。例如:
  1.     //数字格式化
  2.     public static void testSimpleDateFormat_1(){
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  4.         String dateStr = sdf.format(new Date());
  5.         System.out.println(dateStr);
  6.     }
  7.     public static void main(String[] args) throws ParseException {
  8.         testSimpleDateFormat_1();
  9.     }
复制代码
上述代码将当前时间格式化为"yyyy-MM-dd HH:mm:ss.SSS"的格式后输出。输出结果如下所示:
2023-10-17 19:28:31.478
执行结果截图如下:

3. 格式化模式

SimpleDateFormat类支持使用格式化模式来输出日期时间。格式化模式由日期和时间组成,可以自由组合。日期格式化模式包括"y"、“M”、“d”、“E"等,分别表示年、月、日、星期几等。时间格式化模式包括"H”、“m”、“s”、"S"等,分别表示小时、分钟、秒、毫秒等。例如:
  1.     //格式化模式
  2.     public static void testSimpleDateFormat_2() {
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
  4.         String dateStr = sdf.format(new Date());
  5.         System.out.println(dateStr);
  6.     }
  7.     public static void main(String[] args) throws ParseException {
  8.         testSimpleDateFormat_2();
  9.     }
复制代码
上述代码将当前时间格式化为"yyyy-MM-dd E HH:mm:ss"的格式后输出。输出结果如下所示:
2023-10-17 星期二 19:29:42
执行结果截图如下:

测试用例

代码示例

以下是使用SimpleDateFormat类的示例代码及测试用例:
  1. package com.demo.javase.day53;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.TimeZone;
  5. /**
  6. * @author bug菌
  7. * @date 2023/10/17 19:17
  8. */
  9. public class SimpleDateFormatDemo {
  10.     public static void main(String[] args) throws Exception {
  11.         // 格式化日期时间
  12.         SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  13.         String dateStr1 = sdf1.format(new Date());
  14.         System.out.println(dateStr1);
  15.         // 解析日期时间
  16.         SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
  17.         Date date2 = sdf2.parse("2023-10-17");
  18.         System.out.println(date2);
  19.         // 设置时区
  20.         SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  21.         sdf3.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  22.         String dateStr3 = sdf3.format(new Date());
  23.         System.out.println(dateStr3);
  24.         // 转义字符
  25.         SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss");
  26.         String dateStr4 = sdf4.format(new Date());
  27.         System.out.println(dateStr4);
  28.         // 数字格式化
  29.         SimpleDateFormat sdf5 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
  30.         String dateStr5 = sdf5.format(new Date());
  31.         System.out.println(dateStr5);
  32.         // 格式化模式
  33.         SimpleDateFormat sdf6 = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
  34.         String dateStr6 = sdf6.format(new Date());
  35.         System.out.println(dateStr6);
  36.     }
  37. }
复制代码
代码解析

针对如上的测试用例代码,给大家演示了如何使用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类的用法,进而更加灵活地进行日期时间的处理。
点击关注,第一时间了解华为云新鲜技术~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4