news 2026/4/15 13:21:06

Java 日期格式化方法:SimpleDateFormat 和 DateTimeFormatter

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 日期格式化方法:SimpleDateFormat 和 DateTimeFormatter

一、SimpleDateFormat(传统方式)

1. 基本用法
importjava.text.SimpleDateFormat;importjava.util.Date;publicclassDateFormatExample{publicstaticvoidmain(String[]args){// 创建 SimpleDateFormat 实例SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化当前日期StringformattedDate=sdf.format(newDate());System.out.println("当前时间: "+formattedDate);// 2023-12-15 14:30:25}}
2. 常用模式字符
SimpleDateFormatsdf1=newSimpleDateFormat("yyyy年MM月dd日");// 2023年12月15日SimpleDateFormatsdf2=newSimpleDateFormat("yyyy/MM/dd");// 2023/12/15SimpleDateFormatsdf3=newSimpleDateFormat("dd-MM-yyyy");// 15-12-2023SimpleDateFormatsdf4=newSimpleDateFormat("HH:mm:ss");// 14:30:25SimpleDateFormatsdf5=newSimpleDateFormat("hh:mm:ss a");// 02:30:25 下午SimpleDateFormatsdf6=newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");// 2023-12-15T14:30:25.123+0800SimpleDateFormatsdf7=newSimpleDateFormat("EEEE, MMMM dd, yyyy");// 星期五, 十二月 15, 2023
3. 完整示例
importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Locale;publicclassSimpleDateFormatDemo{publicstaticvoidmain(String[]args){try{// 1. 日期转字符串Datenow=newDate();SimpleDateFormatsdf1=newSimpleDateFormat("yyyy-MM-dd");System.out.println("日期: "+sdf1.format(now));SimpleDateFormatsdf2=newSimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");System.out.println("详细时间: "+sdf2.format(now));SimpleDateFormatsdf3=newSimpleDateFormat("EEEE",Locale.CHINA);System.out.println("星期: "+sdf3.format(now));// 2. 字符串转日期StringdateStr="2023-12-15 14:30:00";SimpleDateFormatsdf4=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");DateparsedDate=sdf4.parse(dateStr);System.out.println("解析后的日期: "+parsedDate);// 3. 带时区的格式化SimpleDateFormatsdf5=newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");System.out.println("ISO格式: "+sdf5.format(now));}catch(ParseExceptione){e.printStackTrace();}}}
4. 线程安全问题及解决方案
importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassThreadSafeDateFormat{// 方案1: 每次创建新的实例(开销大但安全)publicStringformatDate1(Datedate){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");returnsdf.format(date);}// 方案2: 使用ThreadLocal(推荐用于多线程)privatestaticfinalThreadLocal<SimpleDateFormat>threadLocalSdf=ThreadLocal.withInitial(()->newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"));publicStringformatDate2(Datedate){returnthreadLocalSdf.get().format(date);}// 方案3: 同步代码块privatestaticfinalSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");publicsynchronizedStringformatDate3(Datedate){returnsdf.format(date);}}

二、DateTimeFormatter(Java 8+ 推荐)

1. 基本用法
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateTimeFormatterDemo{publicstaticvoidmain(String[]args){// 获取当前时间LocalDateTimenow=LocalDateTime.now();// 预定义格式器DateTimeFormatterisoFormatter=DateTimeFormatter.ISO_DATE_TIME;System.out.println("ISO格式: "+now.format(isoFormatter));// 自定义格式器DateTimeFormattercustomFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");System.out.println("自定义格式: "+now.format(customFormatter));DateTimeFormatterchineseFormatter=DateTimeFormatter.ofPattern("yyyy年M月d日 EEEE HH:mm");System.out.println("中文格式: "+now.format(chineseFormatter));}}
2. 完整示例
importjava.time.*;importjava.time.format.DateTimeFormatter;importjava.time.format.FormatStyle;importjava.util.Locale;publicclassJava8DateFormatExample{publicstaticvoidmain(String[]args){// 1. 各种日期时间类型的格式化LocalDatedate=LocalDate.now();LocalTimetime=LocalTime.now();LocalDateTimedateTime=LocalDateTime.now();ZonedDateTimezonedDateTime=ZonedDateTime.now();// 2. 使用预定义格式System.out.println("基本ISO日期: "+date.format(DateTimeFormatter.BASIC_ISO_DATE));System.out.println("ISO日期时间: "+dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));System.out.println("ISO时区时间: "+zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));// 3. 本地化格式化DateTimeFormattershortFormatter=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);DateTimeFormattermediumFormatter=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);DateTimeFormatterlongFormatter=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);DateTimeFormatterfullFormatter=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.CHINA);System.out.println("短格式: "+dateTime.format(shortFormatter));System.out.println("中格式: "+dateTime.format(mediumFormatter));System.out.println("长格式: "+dateTime.format(longFormatter));System.out.println("完整格式: "+dateTime.format(fullFormatter));// 4. 自定义格式DateTimeFormattercustomFormatter1=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");DateTimeFormattercustomFormatter2=DateTimeFormatter.ofPattern("dd-MMM-yyyy",Locale.US);DateTimeFormattercustomFormatter3=DateTimeFormatter.ofPattern("'日期:' yyyy年MM月dd日 '时间:' HH时mm分");System.out.println("斜杠格式: "+dateTime.format(customFormatter1));System.out.println("英文月份: "+date.format(customFormatter2));System.out.println("带文字格式: "+dateTime.format(customFormatter3));// 5. 解析字符串为日期StringdateStr="2023-12-15 14:30:00";DateTimeFormatterparser=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTimeparsedDateTime=LocalDateTime.parse(dateStr,parser);System.out.println("解析后的时间: "+parsedDateTime);// 6. 带时区的格式化DateTimeFormatterzonedFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z").withZone(ZoneId.systemDefault());System.out.println("带时区: "+zonedFormatter.format(zonedDateTime));}}
3. 实用工具类
importjava.time.*;importjava.time.format.DateTimeFormatter;importjava.time.temporal.TemporalAccessor;importjava.util.Date;publicclassDateUtil{// 预定义的格式化器(线程安全,可以全局使用)publicstaticfinalDateTimeFormatterDATE_FORMATTER=DateTimeFormatter.ofPattern("yyyy-MM-dd");publicstaticfinalDateTimeFormatterTIME_FORMATTER=DateTimeFormatter.ofPattern("HH:mm:ss");publicstaticfinalDateTimeFormatterDATETIME_FORMATTER=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");publicstaticfinalDateTimeFormatterTIMESTAMP_FORMATTER=DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");/** * 格式化 LocalDateTime */publicstaticStringformat(LocalDateTimedateTime,Stringpattern){returndateTime.format(DateTimeFormatter.ofPattern(pattern));}/** * 格式化 LocalDate */publicstaticStringformat(LocalDatedate,Stringpattern){returndate.format(DateTimeFormatter.ofPattern(pattern));}/** * 解析字符串为 LocalDateTime */publicstaticLocalDateTimeparseDateTime(StringdateStr,Stringpattern){returnLocalDateTime.parse(dateStr,DateTimeFormatter.ofPattern(pattern));}/** * Date 转 LocalDateTime */publicstaticLocalDateTimetoLocalDateTime(Datedate){returnLocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault());}/** * LocalDateTime 转 Date */publicstaticDatetoDate(LocalDateTimedateTime){returnDate.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());}/** * 生成时间戳字符串 */publicstaticStringgenerateTimestamp(){returnLocalDateTime.now().format(TIMESTAMP_FORMATTER);}/** * 获取中文日期格式 */publicstaticStringgetChineseDate(LocalDatedate){returndate.format(DateTimeFormatter.ofPattern("yyyy年M月d日 E").withLocale(Locale.CHINA));}/** * 格式化持续时间(如:01:23:45) */publicstaticStringformatDuration(Durationduration){longhours=duration.toHours();longminutes=duration.toMinutesPart();longseconds=duration.toSecondsPart();returnString.format("%02d:%02d:%02d",hours,minutes,seconds);}/** * 获取日期范围 */publicstaticStringgetDateRange(LocalDatestart,LocalDateend,Stringpattern){DateTimeFormatterformatter=DateTimeFormatter.ofPattern(pattern);returnstart.format(formatter)+" 至 "+end.format(formatter);}publicstaticvoidmain(String[]args){// 使用示例LocalDateTimenow=LocalDateTime.now();System.out.println("标准格式: "+format(now,"yyyy-MM-dd HH:mm:ss"));System.out.println("中文格式: "+getChineseDate(now.toLocalDate()));System.out.println("时间戳: "+generateTimestamp());System.out.println("使用预定义格式器: "+now.format(DATETIME_FORMATTER));// 解析示例LocalDateTimeparsed=parseDateTime("2023-12-15 14:30:00","yyyy-MM-dd HH:mm:ss");System.out.println("解析结果: "+parsed);}}

三、对比与选择建议

特性SimpleDateFormatDateTimeFormatter
线程安全❌ 不安全✅ 安全
Java 版本1.1+Java 8+
性能较好优秀
易用性简单更直观
功能基础丰富
推荐度旧项目维护新项目首选

四、常见问题解决

1. 时区处理
// SimpleDateFormat 时区设置SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));// DateTimeFormatter 时区设置DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Shanghai"));
2. 语言环境(Locale)
// 中文环境SimpleDateFormatsdfCN=newSimpleDateFormat("yyyy年MM月dd日 EEEE",Locale.CHINA);// 英文环境DateTimeFormatterformatterEN=DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy",Locale.US);
3. 性能优化建议
// 缓存 DateTimeFormatter 实例publicclassFormatterCache{privatestaticfinalMap<String,DateTimeFormatter>FORMATTER_CACHE=newConcurrentHashMap<>();publicstaticDateTimeFormattergetFormatter(Stringpattern){returnFORMATTER_CACHE.computeIfAbsent(pattern,DateTimeFormatter::ofPattern);}publicstaticStringformat(LocalDateTimedateTime,Stringpattern){returndateTime.format(getFormatter(pattern));}}
4. 错误处理
publicclassSafeDateParser{publicstaticDatesafeParse(StringdateStr,Stringpattern){try{SimpleDateFormatsdf=newSimpleDateFormat(pattern);sdf.setLenient(false);// 严格模式,防止"2023-02-30"被接受returnsdf.parse(dateStr);}catch(ParseExceptione){// 记录日志,返回默认值或抛出业务异常returnnull;}}publicstaticLocalDateTimesafeParseDateTime(StringdateStr,Stringpattern){try{DateTimeFormatterformatter=DateTimeFormatter.ofPattern(pattern);returnLocalDateTime.parse(dateStr,formatter);}catch(DateTimeParseExceptione){// 处理解析失败returnnull;}}}

总结建议

  1. 新项目:优先使用DateTimeFormatter(Java 8+)
  2. 旧项目维护:继续使用SimpleDateFormat,注意线程安全
  3. 多线程环境:使用ThreadLocal<SimpleDateFormat>DateTimeFormatter
  4. 复杂日期操作:使用java.time包(Java 8+)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 20:25:37

Qt QtWebEngine 白屏的解决方案

公众号:cpp手艺人 Qt QtWebEngine 白屏的解决方案 最近在项目中有同事反馈,软件在开启的瞬间和长时间挂机之后,会出现白屏的现象。 先来看看白屏的常见原因和解决方案 1、QtWebEngine 白屏最常见的 5 大原因和解决方案: 主要原因 解决方式 GPU 加速问题 禁用 GPU、使用…

作者头像 李华
网站建设 2026/4/13 15:12:09

TCU变速箱控制器仿真模型:从代码到现实的传动艺术

TCU变速箱控制器仿真模型-含&#xff08;设计文档&#xff09; 乘用车AMTTCU变速箱控制器仿真模型算法模块&#xff0c;含&#xff0c;TCU应用层软件&#xff0c;驱动制动数学模型&#xff0c;电机传动数学模型&#xff0c;车辆数学模型等,在售产品已量产。 含有的功能模块包括…

作者头像 李华
网站建设 2026/4/13 19:59:09

QWebEngine 是什么?与 Chromium 的关系解析

公众号:cpp手艺人 QWebEngine 是什么?与 Chromium 的关系解析 1. 概述:QWebEngine 是什么? QWebEngine 是 Qt 框架中用于嵌入现代 Web 内容的核心模块,自 Qt 5.4(2014年)起正式引入,取代了旧版的 QtWebKit。它基于 Chromium 项目构建,为 Qt 应用程序提供高性能、安…

作者头像 李华
网站建设 2026/4/1 9:08:33

QWebEngine 常用 API 全面梳理

公众号:cpp手艺人 QWebEngine 常用 API 全面梳理(超全版本) Qt WebEngine 基于 Chromium,但提供了 Qt 风格的 API。本文对 QWebEngine 的常用类与 API 进行系统梳理,帮助你快速掌握其开发全景。 1. QWebEngineView(视图层) QWebEngineView 是最常用的 UI 控件,主要…

作者头像 李华
网站建设 2026/4/8 6:28:49

探索 COMSOL 光学与相场模拟的奇妙世界

COMSOL光学模型&#xff1a;随机分布颗粒散射&#xff0c;COMSOL光学仿真模型:光镊/光力模型&#xff08;包含三个模型&#xff0c;近似算法&#xff0c;张量算法&#xff09;相场模拟——合金&#xff0c;金属凝固模型&#xff0c;各向异性枝晶生长karma合金凝固模型&#xff…

作者头像 李华
网站建设 2026/4/15 15:10:02

【Linux网络编程】UDP Socket

前言:最近在复习 Linux 网络编程,重点梳理了 UDP 协议的实现细节。虽然 UDP 是无连接、不可靠的协议,但其简单高效的特性在很多场景下(如实时音视频、DNS)依然是首选。从最简单的 Echo Server 出发,逐步重构为支持业务解耦的字典服务器,最后实现一个支持多线程的全双工聊…

作者头像 李华