SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出, 但如果使用不小心 会导致非常微妙和难以调试的问题, 因为 DateFormat 和 SimpleDateFormat...通过一个具体的场景来深入理解SimpleDateFormat 类。 一.引子 在程序中我们应当尽量少的创建SimpleDateFormat 实例,因为创建这么一个实例需要耗费很大的代价。...(SimpleDateFormat.java:1589) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)...(SimpleDateFormat.java:1589) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)...上面的优化过的静态的SimpleDateFormat版,之所在并发情况下回出现各种灵异错误,是因为SimpleDateFormat和DateFormat类不是线程安全的。
1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormat is a concrete class for formatting...1.1使用SimpleDateFormat simpleDateFormat的使用方法比较简单: public static void main(String[] args) throws Exception...{ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); System.out.println...3.如何避坑 对于SimpleDateFormat的解决方法有下面几种: 3.1新建SimpleDateFormat 上面出现Bug的原因是因为所有线程都共用一个SimpleDateFormat,这里有个比较好解决的办法...(simpleDateFormat == null){ simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss") simpleDateFormatThreadLocal.set
1、SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午...aDate=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); SimpleDateFormat bDate=new SimpleDateFormat("yyyy-mmmmmm-dddddd...myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); SimpleDateFormat myFmt1=new SimpleDateFormat("yy.../MM/dd HH:mm"); SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString...() SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E "); SimpleDateFormat myFmt4=
前言 日常开发中,我们经常需要使用时间相关类,想必大家对SimpleDateFormat并不陌生。...下面我们就来分析分析SimpleDateFormat为什么不安全?是怎么引发的?以及多线程下有那些SimpleDateFormat的解决方案?...先看看《阿里巴巴开发手册》对于SimpleDateFormat是怎么看待的 问题复现 一般我们在使用SimpleDateFormat的时候会把它定义为一个静态变量,避免频繁创建它们的对象实例,代码如下...多线程不安全原因 因为我们把SimpleDateFormat定义为静态变量,那么多线程下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间,就会出现时间差异和其它各种问题...来看看SimpleDateFormat的format()方法的源码: 注意, calendar.setTime(date),SimpleDateFormat的format方法实际操作的就是Calendar
因此在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time...SimpleDateFormat 的 format 方法线程不安全问题 public final String format(Date arg0) { return this.format...SimpleDateFormat是继承DateFormat类,DateFormat类中维护一个Calendar 对象 SimpleDateFormat 继承 DateFormat ,使用的calendar...是父类 DateFormat中的 public class SimpleDateFormat extends DateFormat {} DateFormat 的 calendar 被用来进行 日期...解决方案: 1、将SimpleDateFormat定义成局部变量 2、 加一把线程同步锁:synchronized(lock) 3、使用ThreadLocal,每个线程都拥有自己的SimpleDateFormat
先看一个代码示例: import java.text.SimpleDateFormat; import java.util.Date; public class test{ public static...void main(String args[]) { Date newTime = new Date(); //设置时间格式 SimpleDateFormat...sdf1 = new SimpleDateFormat("y-M-d h:m:s a E"); SimpleDateFormat sdf2 = new SimpleDateFormat...("yy-MM-dd hh:mm:ss a E"); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MMM-ddd hhh:mmm...:sss a E"); SimpleDateFormat sdf4 = new SimpleDateFormat("yyyyy-MMMM-dddd hhhh:mmmm:ssss a EEEE
8.5 SimpleDateFormat是线程不安全的 SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat...问题分析 为了便于分析首先奉上SimpleDateFormat的类图结构: ?...image.png 可知每个SimpleDateFormat实例里面有一个Calendar对象,从后面会知道其实SimpleDateFormat之所以是线程不安全的就是因为Calendar是线程不安全的...SimpleDateFormat对象。...总结 本节通过简单介绍SimpleDateFormat的原理说明了SimpleDateFormat是线程不安全的,应该避免多线程下使用SimpleDateFormat的单个实例,多线程下使用时候最好使用
SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错...代码示例演示 写一段小Demo来模拟多线程下SimpleDateFormat做时间格式化的时候报错,代码如下: package com.vernon.test.demo.jdk.text; import...(SimpleDateFormat.java:1869) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) at java.text.DateFormat.parse...(SimpleDateFormat.java:1869) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) at java.text.DateFormat.parse...的一个类关系图: 可知每个SimpleDateFormat实例里面有一个Calendar对象,从后面会知道其实SimpleDateFormat之所以是线程不安全的就是因为Calendar是线程不安全的
这个SimpleDateFormat类大家都很熟悉,也是之前非常喜欢用的时间处理累类。平常可能会处理到的就是秒级别或者三位的毫秒级别。...-02-07 13:58:08.424527802 +0800";// dateTimeString = "2024-02-07 13:58:08.424 +0800"; SimpleDateFormat...dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z"); try { Date date
为啥要用SimpleDateFormat 2. 日期格式化显示 3. 将字符串转换为对应日期 1....sdf1=new SimpleDateFormat("yyyyMMdd");//显示20171027格式 SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd...");//显示2017-10-27格式 SimpleDateFormat sdf3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//显示2017-10-27...10:00:00格式 SimpleDateFormat sdf4=new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");//显示2017年10月27日10时00...sdf1=new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd HH:mm
说明 1.8 以前 Java 关于日期的类是 Date 与 Calendar, 与之对应的格式化的类是 SimpleDateFormat。...优缺点比较 很多文章写过 SimpleDateFormat 类,每当提到它,都会让开发人员注意这个类并不是线程安全的,也就是每次使用都必须新生成,而不能当作全局静态变量来使用。...就像 Date 是可变类型是一个设计失误一样,SimpleDateFormat 设计为非线程安全也是一个设计失误,这样的设计失误却需要由程序员来承担。...DateTimeFormatter 在职责分离上也更清晰,由于 Date 没有时区 的信息,所以在格式化时这个任务就只能由 SimpleDateFormat 承担,导致很难理解 SimpleDateFormat...LocalDateTime.now(); return formatter.format(localDateTime); 」 DateTimeFormatter 的 pattern 与 SimpleDateFormat
将特定字符串转换成Date格式 可以通过 new 一个 SimpleDateFormat 对象,通过对象调用parse方法实现 示例代码: String time = "2019-11-09"; SimpleDateFormat...simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date dateTime = null; try { dateTime = simpleDateFormat.parse...(time); } catch (ParseException e) { e.printStackTrace(); } 将Date格式转化成特定字符串 import java.text.SimpleDateFormat...sdf = new SimpleDateFormat(strDateFormat); System.out.println(sdf.format(date)); } } 注意:...SimpleDateFormat 12小时制和24小时制的区别 使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日; 如果希望格式化时间为12小时制的,则使用hh:mm
SimpleDateFormat方法 在Java中,SimpleDateFormat类是用于日期格式化和解析的类。它位于java.text包中。...():构造一个SimpleDateFormat,使用默认模式和日期 SimpleDateFormat(String pattern): 构造一个SimpleDateFormat使用给定的模式和默认的日期格式...注意 SimpleDateFormat不是线程安全的。如果多个线程同时使用同一个SimpleDateFormat对象,可能会导致结果不正确。...sdf = new SimpleDateFormat(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss...sdf2=new SimpleDateFormat("2021年10月27日 11:11:11"); SimpleDateFormat sdf2=new SimpleDateFormat
示例 @Slf4j class Test { private static final SimpleDateFormat FORMATTER = new SimpleDateFormat
一般格式化时,常用到这两个类:Calendar 和SimpleDateFormat ,使用方法如下: 1.Calendar类 Calendar类是abstract的,所以实例化方式得用静态方法: Calendar...Calendar ca = Calendar.getInstance(); ca.setTime(date); System.out.print(ca.get(Calendar.MONTH) + 1 2.SimpleDateFormat...类 Date date = rs.getDate(“hiredate”); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern...import java.io.FileWriter; import java.io.IOException; import java.sql.SQLException; import java.text.SimpleDateFormat
跟踪代码后发现源码中有明确说明SimpleDateFormat不应该应用于多线程场景下。 Synchronization //SimpleDateFormat中的日期格式化不是同步的。...(SimpleDateFormat.java:1869) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) at java.text.DateFormat.parse...(SimpleDateFormat.java:1869) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) at java.text.DateFormat.parse...为什么SimpleDateFormat类不是线程安全的?...SimpleDateFormat对parse()方法的实现。
下面我们就来分析分析SimpleDateFormat为什么不安全?是怎么引发的?以及多线程下有那些SimpleDateFormat的解决方案?...先看看《阿里巴巴开发手册》对于SimpleDateFormat是怎么看待的: ?...多线程不安全原因 因为我们吧SimpleDateFormat定义为静态变量,那么多线程下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间,就会出现时间差异和其它各种问题...SimpleDateFormat和它继承的DateFormat类也不是线程安全的 来看看SimpleDateFormat的format()方法的源码 // Called from Format after...synchronized大法好 private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss
/** SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时...一年中第几个星期 W 一月中第几个星期 a 上午 / 下午 标记符 k 时 在一天中 (1~24) K 时 在上午或下午 (0~11) z 时区 */ 在使用SimpleDateFormat
下面我们就来分析分析SimpleDateFormat为什么不安全?是怎么引发的?以及多线程下有那些SimpleDateFormat的解决方案?...先看看《阿里巴巴开发手册》对于SimpleDateFormat是怎么看待的: ?...多线程不安全原因 因为我们吧SimpleDateFormat定义为静态变量,那么多线程下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间,就会出现时间差异和其它各种问题...SimpleDateFormat和它继承的DateFormat类也不是线程安全的 来看看SimpleDateFormat的format()方法的源码 copy// Called from Format...(String strDate) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH
领取专属 10元无门槛券
手把手带您无忧上云