如何在Java中使用SimpleDateFormat格式化日期

使用SimpleDateFormat格式化日期需创建实例并调用format()方法,但其非线程安全,推荐用ThreadLocal或Java 8的DateTimeFormatter替代。

如何在java中使用simpledateformat格式化日期

在Java中,使用

SimpleDateFormat

格式化日期,核心就是将一个

Date

对象转换成我们人类能读懂的、特定格式的字符串。它通过定义一个模式字符串(pattern string)来指导日期时间的显示方式,让原本无序的日期数据变得井井有条。

使用

SimpleDateFormat

格式化日期,通常分两步走:首先,你需要根据想要的日期时间格式,创建一个

SimpleDateFormat

实例;接着,调用这个实例的

format()

方法,传入你的

Date

对象,就能得到格式化后的字符串了。

import java.text.SimpleDateFormat;import java.util.Date;public class DateFormatterExample {    public static void main(String[] args) {        // 1. 获取当前日期时间        Date now = new Date();        // 2. 定义你想要的日期时间格式        // 例如:"yyyy-MM-dd HH:mm:ss" 会显示像 "2023-10-27 15:30:00" 这样的格式        // "yyyy年MM月dd日 E HH时mm分ss秒" 会显示像 "2023年10月27日 星期五 15时30分00秒"        String pattern = "yyyy-MM-dd HH:mm:ss"; // 我个人最常用的一种,简洁明了        // 3. 创建 SimpleDateFormat 实例        SimpleDateFormat formatter = new SimpleDateFormat(pattern);        // 4. 使用 format() 方法将 Date 对象格式化为字符串        String formattedDate = formatter.format(now);        System.out.println("原始日期: " + now);        System.out.println("格式化后的日期: " + formattedDate);        // 反过来,如果你有一个日期字符串,想把它解析成 Date 对象,也可以用 parse() 方法        String dateString = "2024-01-01 08:00:00";        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        try {            Date parsedDate = parser.parse(dateString);            System.out.println("解析后的日期: " + parsedDate);        } catch (java.text.ParseException e) {            System.err.println("日期字符串解析失败: " + e.getMessage());        }    }}

这里面的模式字符串(pattern string)是关键。

y

代表年份,

M

代表月份,

d

代表日期,

H

代表24小时制的小时,

H

代表12小时制的小时,

M

代表分钟,

s

代表秒,

s

代表毫秒,

E

代表星期几。字符的数量会影响输出的格式,比如

MM

会输出两位数的月份(01-12),

MMM

会输出缩写(Jan, Feb),

MMMM

会输出完整名称(January, February)。我通常会根据需求去查阅一下Java官方文档,确保模式字符的正确使用,因为有时候一些细微的差别会导致意想不到的输出。

SimpleDateFormat的线程安全问题:那些隐藏的坑

说实话,

SimpleDateFormat

用起来确实方便,但它有一个非常大的“坑”,那就是它不是线程安全的。我第一次遇到这个问题时,是在一个多线程环境中,偶尔会发现日期格式化结果是错乱的,甚至直接抛出异常,当时真是把我搞得一头雾水。

立即学习“Java免费学习笔记(深入)”;

简单来说,

SimpleDateFormat

的

format()

和

parse()

方法内部使用了共享的成员变量,当多个线程同时访问这些方法时,这些共享变量的状态就可能被意外修改,导致结果不一致。这就好比多个厨师共用一个案板,但每个人都在上面切菜,没有加锁,最后案板上的东西就乱套了。

为了解决这个问题,通常有几种做法:

比格设计 比格设计

比格设计是135编辑器旗下一款一站式、多场景、智能化的在线图片编辑器

比格设计 124 查看详情 比格设计

每次使用时都创建新实例:这是最直接,也最笨但最安全的方法。每次需要格式化或解析日期时,都

new SimpleDateFormat()

一个新对象。这虽然解决了线程安全问题,但频繁创建对象会带来一定的性能开销,尤其是在高并发场景下,我个人会尽量避免这种方式。

// 每次都创建新实例,确保线程安全public String formatThreadSafe(Date date) {    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);}

使用

ThreadLocal

包装:这是我比较推荐的一种方案,它能保证每个线程都拥有自己的

SimpleDateFormat

实例,既避免了线程安全问题,又避免了频繁创建对象的开销。

import java.text.SimpleDateFormat;import java.util.Date;public class ThreadLocalDateFormat {    private static final ThreadLocal formatter = ThreadLocal.withInitial(        () -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));    public static String format(Date date) {        return formatter.get().format(date);    }    public static Date parse(String dateString) throws java.text.ParseException {        return formatter.get().parse(dateString);    }    public static void main(String[] args) {        // 示例:在多个线程中使用        for (int i = 0; i  {                try {                    String formatted = format(new Date());                    System.out.println(Thread.currentThread().getName() + " formatted: " + formatted);                    Date parsed = parse("2023-11-11 11:11:11");                    System.out.println(Thread.currentThread().getName() + " parsed: " + parsed);                } catch (java.text.ParseException e) {                    e.printStackTrace();                }            }, "Thread-" + i).start();        }    }}

这种方式在Java 8之前是处理

SimpleDateFormat

线程安全问题的标准做法,既保证了正确性,又兼顾了性能。

现代Java日期API:使用DateTimeFormatter的优雅之道

在我看来,Java 8引入的

java.time

包(也称为JSR 310)彻底改变了Java日期时间处理的格局,它提供了一套全新的、更强大、更易用且线程安全的API。如果你正在使用Java 8或更高版本,我强烈建议你放弃

SimpleDateFormat

,转而使用

DateTimeFormatter

。

DateTimeFormatter

是

java.time

包中用于格式化和解析日期时间的核心类,它与

LocalDate

、

LocalTime

、

LocalDateTime

、

ZonedDateTime

等类配合使用。它的设计初衷就考虑到了线程安全,因此你无需担心多线程并发问题。

import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.time.format.DateTimeParseException;public class ModernDateFormatterExample {    public static void main(String[] args) {        // 1. 获取当前日期时间        LocalDateTime now = LocalDateTime.now();        // 2. 定义你想要的日期时间格式        // DateTimeFormatter 的模式与 SimpleDateFormat 类似,但更严格和清晰        String pattern = "yyyy-MM-dd HH:mm:ss";        // 我个人觉得,对于一些标准格式,直接用预定义的常量更方便,比如 ISO_LOCAL_DATE_TIME        // DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; // 2023-10-27T15:30:00        // 3. 创建 DateTimeFormatter 实例        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);        // 4. 使用 format() 方法将 LocalDateTime 对象格式化为字符串        String formattedDateTime = now.format(formatter);        System.out.println("原始日期时间: " + now);        System.out.println("格式化后的日期时间: " + formattedDateTime);        // 反过来,解析字符串到 LocalDateTime        String dateTimeString = "2024-01-01 09:30:15";        try {            LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);            System.out.println("解析后的日期时间: " + parsedDateTime);        } catch (DateTimeParseException e) {            System.err.println("日期时间字符串解析失败: " + e.getMessage());        }        // 对于只处理日期或时间的情况,也有对应的类        // LocalDate today = LocalDate.now();        // DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");        // System.out.println("格式化日期: " + today.format(dateFormatter));    }}

DateTimeFormatter

的好处显而易见:它不仅解决了线程安全问题,还提供了更丰富的API,例如链式调用、对时区处理的良好支持等等。它的模式字符串虽然和

SimpleDateFormat

有些相似,但更加直观和一致。在我看来,一旦你开始使用

java.time

包,你就会发现之前的日期时间处理简直是“上古时代”的体验了。从项目的长期维护性和代码的健壮性考虑,我总是推荐优先使用

DateTimeFormatter

。

以上就是如何在Java中使用SimpleDateFormat格式化日期的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/326171.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
linux rm命令是什么
上一篇 2026年11月3日 17:19:40
Python中具有相同参数的类实例不相等的问题解析与解决方案
下一篇 2025年12月14日 04:38:19

相关推荐

  • Java java.time:解析与格式化带可变小数秒和时区偏移的日期字符串

    Java java.time:解析与格式化带可变小数秒和时区偏移的日期字符串Java java.time:解析与格式化带可变小数秒和时区偏移的日期字符串Java java.time:解析与格式化带可变小数秒和时区偏移的日期字符串Java java.time:解析与格式化带可变小数秒和时区偏移的日期字符串

    在 Java 开发中,日期时间处理是一个常见且复杂的需求。尤其当面对包含可变精度小数秒(例如 2022-11-08 10:28:04.282551-06、2022-11-08 10:28:04.282-06 甚至 2022-11-08 10:28:04-06)以及时区偏移的字符串时,传统的 java…

    2026年11月3日 • 用户投稿
    000
  • 如何安装和应用Grok-4 Grok-4的智能特性与技术创新

    grok-4无法像普通软件直接安装,1. 需通过官方渠道申请api密钥并经过审核;2. 获取密钥后使用官方sdk(如python的grok-sdk)集成到应用中;3. 通过精心设计的提示词(prompt)调用其在复杂推理、多模态理解与创造性生成方面的强大能力;该模型可能基于混合专家架构与自适应学习策…

    2026年11月3日
    100
  • 如何在Java中实现线程安全的集合操作

    如何在Java中实现线程安全的集合操作如何在Java中实现线程安全的集合操作如何在Java中实现线程安全的集合操作如何在Java中实现线程安全的集合操作

    答案:Java中实现线程安全集合操作的核心是确保多线程环境下数据一致性,主要通过java.util.concurrent包中的并发集合类(如ConcurrentHashMap、CopyOnWriteArrayList)、Collections.synchronizedXxx包装器或手动使用synch…

    2026年11月3日 • 用户投稿
    100
  • Safari浏览器官网 Safari直接访问

    Safari浏览器官网 Safari直接访问Safari浏览器官网 Safari直接访问Safari浏览器官网 Safari直接访问Safari浏览器官网 Safari直接访问

    Safari浏览器官网是https://www.apple.com/safari/,提供智能防跟踪、阅读器视图、标签页分组管理等功能,并具备隐私报告、密码监控、跨设备协同等特性。 Safari浏览器官网在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Safari浏览器直接访问入口地址,感兴…

    2026年11月3日 • 用户投稿
    100
  • opporeno14隐藏功能大公开_opporeno不为人知的实用功能

    opporeno14隐藏功能大公开_opporeno不为人知的实用功能opporeno14隐藏功能大公开_opporeno不为人知的实用功能opporeno14隐藏功能大公开_opporeno不为人知的实用功能opporeno14隐藏功能大公开_opporeno不为人知的实用功能

    OPPO Reno14通过ColorOS系统在效率、隐私、影像和游戏方面提供多项实用功能。智能侧边栏可自定义添加常用应用和工具,实现快速启动与屏幕翻译;自由浮窗和闪回窗口支持多任务并行处理,提升操作流畅度。应用分身与隐私空间有效隔离工作生活数据,系统分身更实现双系统独立运行。AI证件照、多景录像和A…

    2026年11月3日 • 用户投稿
    000
  • 如何用Java实现图形界面记账软件

    如何用Java实现图形界面记账软件如何用Java实现图形界面记账软件如何用Java实现图形界面记账软件如何用Java实现图形界面记账软件

    答案是使用Swing构建记账软件,通过JFrame和JTable搭建界面,定义Record类管理账目数据,利用ArrayList存储记录,并结合文件读写实现数据持久化,完成添加、删除、显示和统计功能。 用Java实现图形界面记账软件,核心是结合Swing或JavaFX构建用户界面,配合数据结构和文件…

    2026年11月3日 • 用户投稿
    000
  • Java教程:高效处理字符串去重与共享字符计数

    Java教程:高效处理字符串去重与共享字符计数Java教程:高效处理字符串去重与共享字符计数Java教程:高效处理字符串去重与共享字符计数Java教程:高效处理字符串去重与共享字符计数

    本文详细阐述了如何在Java中对给定字符串和字符串数组进行字符去重处理,并进一步统计数组中每个去重字符串与主去重字符串之间共享的独立字符数量。通过引入高效的辅助函数和数据结构,本教程提供了一种结构清晰、性能优化的解决方案,旨在帮助开发者有效处理此类字符串操作。 1. 问题概述 在许多文本处理场景中,…

    2026年11月3日 • 用户投稿
    200
  • Google官方主页直达地址 Google平台链接官方访问首页

    Google官方主页直达地址 Google平台链接官方访问首页Google官方主页直达地址 Google平台链接官方访问首页Google官方主页直达地址 Google平台链接官方访问首页Google官方主页直达地址 Google平台链接官方访问首页

    Google官方主页直达地址是https://www.google.com,页面布局简洁,具备智能搜索、多语言识别和强大生态集成等功能。 Google官方主页直达地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Google平台链接官方访问首页,感兴趣的网友一起随小编来瞧瞧吧! http…

    2026年11月3日 • 用户投稿
    000
  • Java字符串去重与字符集合匹配计数教程

    Java字符串去重与字符集合匹配计数教程Java字符串去重与字符集合匹配计数教程Java字符串去重与字符集合匹配计数教程Java字符串去重与字符集合匹配计数教程

    本教程详细介绍了如何在Java中高效处理字符串,实现字符去重以及基于去重后的字符集合进行匹配计数。文章通过一个具体场景,展示了如何将主字符串和字符串数组中的每个元素进行字符去重,然后统计主字符串的去重字符集在每个数组元素的去重字符集中出现的次数,提供了清晰的实现代码和专业解析。 在软件开发中,经常会…

    2026年11月3日 • 用户投稿
    000
  • 百度最新版官方网址 百度平台直达链接官方主页

    百度最新版官方网址 百度平台直达链接官方主页百度最新版官方网址 百度平台直达链接官方主页百度最新版官方网址 百度平台直达链接官方主页百度最新版官方网址 百度平台直达链接官方主页

    百度最新版官方网址是www.baidu.com,该平台提供智能搜索、个性化推荐及多元化资源整合,覆盖新闻、视频、地图、文库等服务,支持多端适配与账号同步功能。 百度最新版官方网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来百度平台直达链接官方主页,感兴趣的网友一起随小编来瞧瞧吧! ww…

    2026年11月3日 • 用户投稿
    100
  • EnumSet和EnumMap在Java中的应用

    EnumSet和EnumMap在Java中的应用EnumSet和EnumMap在Java中的应用EnumSet和EnumMap在Java中的应用EnumSet和EnumMap在Java中的应用

    EnumSet和EnumMap专为枚举设计,利用位向量和数组索引实现高效存储与访问,相比HashSet和HashMap避免了哈希开销,提升性能与内存效率,适用于权限、状态、配置等场景。 Java里,当我们处理枚举类型(Enum)的集合或映射时, EnumSet 和 EnumMap 简直是为它们量身定…

    2026年11月3日 • 用户投稿
    200
  • Java中Timer和TimerTask使用技巧

    Java中Timer和TimerTask使用技巧Java中Timer和TimerTask使用技巧Java中Timer和TimerTask使用技巧Java中Timer和TimerTask使用技巧

    Timer和TimerTask通过单线程调度定时任务,适合轻量级、短时任务,但异常或长任务会阻塞或终止整个调度;应优先使用ScheduledThreadPoolExecutor,因其支持多线程、异常隔离和更灵活的调度,提升系统健壮性。 在Java中, Timer 和 TimerTask 这对组合,就…

    2026年11月3日 • 用户投稿
    000
  • 在云服务器上安装Java的最佳实践

    在云服务器上安装Java的最佳实践在云服务器上安装Java的最佳实践在云服务器上安装Java的最佳实践在云服务器上安装Java的最佳实践

    选择OpenJDK并通过包管理器安装,配置JAVA_HOME环境变量并验证版本与路径,可确保云服务器Java环境稳定安全。 在云服务器上安装Java,最核心的实践在于选择一个稳定、安全且易于维护的OpenJDK发行版,并利用操作系统的包管理器进行安装与管理,辅以环境变量的规范配置,这能最大化地保证系…

    2026年11月3日 • 用户投稿
    100
  • 使用Josson库高效查找JSON文件中的重复键值对

    使用Josson库高效查找JSON文件中的重复键值对使用Josson库高效查找JSON文件中的重复键值对使用Josson库高效查找JSON文件中的重复键值对使用Josson库高效查找JSON文件中的重复键值对

    本教程旨在指导读者如何利用Java的Josson库,高效识别并提取JSON文件中跨多个对象存在的重复键值对。文章将详细介绍Josson的强大转换能力,并通过具体代码示例,演示如何构建查询语句以实现这一复杂的数据分析任务,从而避免手动遍历和比较的繁琐。 引言 在处理复杂的json数据时,我们经常会遇到…

    2026年11月3日 • 用户投稿
    100
  • vivo浏览器怎么查找页面内的文字_vivo浏览器快速查找网页文字的方法

    vivo浏览器怎么查找页面内的文字_vivo浏览器快速查找网页文字的方法vivo浏览器怎么查找页面内的文字_vivo浏览器快速查找网页文字的方法vivo浏览器怎么查找页面内的文字_vivo浏览器快速查找网页文字的方法vivo浏览器怎么查找页面内的文字_vivo浏览器快速查找网页文字的方法

    vivo浏览器支持页面内文字查找,1、打开浏览器进入网页,调出菜单选择“查找在页面上”,输入关键词即可高亮显示并定位;2、复制文字后,通过地址栏粘贴搜索可快速触发页面内查找;3、启用AI助手功能,滑出浮窗发送查找指令,可智能定位关键词位置并摘要内容。 如果您在浏览网页时需要快速定位特定信息,但手动查…

    2026年11月3日 • 用户投稿
    300
  • Via浏览器怎么开启开发者工具模式_Via浏览器调试网页的开发者工具使用方法

    Via浏览器怎么开启开发者工具模式_Via浏览器调试网页的开发者工具使用方法Via浏览器怎么开启开发者工具模式_Via浏览器调试网页的开发者工具使用方法Via浏览器怎么开启开发者工具模式_Via浏览器调试网页的开发者工具使用方法Via浏览器怎么开启开发者工具模式_Via浏览器调试网页的开发者工具使用方法

    首先启用Via浏览器开发者模式,连续点击版本号5次后开启Web检查器;再通过USB调试连接电脑,在Chrome中使用chrome://inspect远程调试;也可直接在手机上长按页面选择“检查元素”调用内置调试面板查看DOM与CSS。 如果您希望在浏览网页时进行调试或查看页面元素,可以通过开启开发者…

    2026年11月3日 • 用户投稿
    000
  • Java中Collections.list方法将Enumeration转List

    Java中Collections.list方法将Enumeration转ListJava中Collections.list方法将Enumeration转ListJava中Collections.list方法将Enumeration转ListJava中Collections.list方法将Enumeration转List

    Collections.list() 将 Enumeration 转为 ArrayList,实现新旧 API 平滑过渡,简化代码并支持现代集合操作。 Collections.list() 是 Java 提供的一个便捷方法,它能将一个旧式的 Enumeration 接口包装成一个现代的 ArrayLi…

    2026年11月3日 • 用户投稿
    000
  • Claude如何优化核聚变控制 Claude等离子体约束方案

    Claude如何优化核聚变控制 Claude等离子体约束方案Claude如何优化核聚变控制 Claude等离子体约束方案Claude如何优化核聚变控制 Claude等离子体约束方案Claude如何优化核聚变控制 Claude等离子体约束方案

    控制核聚变反应堆中的等离子体是一个极其复杂的技术挑战,尤其是在维持等离子体的稳定性和约束效率方面。本文将探讨如何利用人工智能模型,例如像Claude这样的AI,来优化核聚变等离子体的控制方案。我们将从分析等离子体约束的难点入手,逐步讲解AI如何通过数据分析、行为预测和控制策略生成来提升约束效果,并提…

    2026年11月3日 • 用户投稿
    200
  • ChatGPT能否生成反重力装置 ChatGPT突破性物理概念设计

    ChatGPT能否生成反重力装置 ChatGPT突破性物理概念设计ChatGPT能否生成反重力装置 ChatGPT突破性物理概念设计ChatGPT能否生成反重力装置 ChatGPT突破性物理概念设计ChatGPT能否生成反重力装置 ChatGPT突破性物理概念设计

    关于大型语言模型如ChatGPT能否生成反重力装置的设计概念,以及其在物理概念设计中扮演的角色,本文将对此进行探讨。我们将解析ChatGPT的能力边界,特别是在处理复杂、前沿物理问题时的表现,并提供一个使用这类工具进行概念性探索的过程指导,帮助读者理解如何利用AI进行思维启发,而非期望其输出实际可行…

    2026年11月3日 • 用户投稿
    000
  • 生成字符串数组组合教程:利用嵌套循环与LINQ构建所有可能连接

    生成字符串数组组合教程:利用嵌套循环与LINQ构建所有可能连接生成字符串数组组合教程:利用嵌套循环与LINQ构建所有可能连接生成字符串数组组合教程:利用嵌套循环与LINQ构建所有可能连接生成字符串数组组合教程:利用嵌套循环与LINQ构建所有可能连接

    本教程详细介绍了如何将两个字符串数组中的元素进行两两组合,生成一个包含所有可能连接的新字符串数组。文章将深入探讨使用嵌套循环的基本实现方法,并通过Java代码示例进行演示,同时也会介绍C#中利用LINQ表达式实现此功能的简洁方式,并提供相关的注意事项和最佳实践。 一、核心问题与目标 在软件开发中,我…

    2026年11月3日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信