文档章节

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

人觉非常君
 人觉非常君
发布于 06/22 02:32
字数 528
阅读 21
收藏 1

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。

在并发环境下使用SimpleDateFormat

为了能够在多线程环境下使用SimpleDateFormat,有这三种方法:

方法一

在需要执行格式化的地方都新建SimpleDateFormat实例,使用局部变量来存放SimpleDateFormat实例

public static String formatDate(Date date) throws ParseException { 
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	return sdf.format(date); 
}

这种方法可能会导致短期内创建大量的SimpleDateFormat实例,如解析一个excel表格里的字符串日期。

方法二

为了避免创建大量的SimpleDateFormat实例,往往会考虑把SimpleDateFormat实例设为静态成员变量,共享SimpleDateFormat对象。这种情况下就得对SimpleDateFormat添加同步。

private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

public static String formatDate(Date date) throws ParseException { 
	synchronized(sdf) { 
		return sdf.format(date); 
	} 
}

这种方法的缺点也很明显,就是在高并发的环境下会导致解析被阻塞。

方法三(推荐)

要在高并发环境下能有比较好的体验,可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,这样就避免了多线程导致的线程安全问题。

private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { 
	@Override 
	protected DateFormat initialValue() { 
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	} 
};

public static String format(Date date) { 
	return threadLocal.get().format(date); 
}

DateTimeFormatter使用

解析日期

String dateStr= "2016年10月25日"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");   
LocalDate date= LocalDate.parse(dateStr, formatter);

日期转换为字符串

LocalDateTime now = LocalDateTime.now(); 
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a"); 
String nowStr = now .format(format);

由DateTimeFormatter的静态方法ofPattern()构建日期格式,LocalDateTime和LocalDate等一些表示日期或时间的类使用parse和format方法把日期和字符串做转换。

使用新的API,整个转换过程都不需要考虑线程安全的问题。

本文转载自:https://majing.io/questions/774

共有 人打赏支持
人觉非常君
粉丝 6
博文 43
码字总数 29951
作品 0
浦东
私信 提问
Java新增的日期时间格式器

在java.time.format包下提供一个DateTimeFormatter格式器类,该类相当于DateFormat和SimpleDateFormat的合体功能更强大。DateTimeFormat不仅可以将日期、时间对象格式化成字符串,也可以将特...

西红柿的眼泪
2016/07/12
36
0
java并发编程——线程不安全的类

什么是线程不安全的类? 如果一个类的对象同时被多个线程访问,如果不做特殊的同步或并发处理,很容易表现出线程不安全的现象,比如抛出异常、逻辑处理错误等,这种类我们就称为线程不安全的...

长头发-dawn
10/08
0
0
simpleDateFormat线程不安全

simpleDateFormat是我们比较常用的日期转换类,但是它是一个线程不安全的类。举例证明 这段代码在运行的过程中,会报错。 定义一个静态的SimpleDateFormat实例,是大家在日期工具类中比较通常...

wuyiyi
12/04
0
0
jdk8中新的获取时间的方式

一些类的介绍 · LocalDateTime:存储了日期和时间,如:2013-10-15T14:43:14.539。 · LocalDate:存储了日期,如:2013-10-15。 · LocalTime:存储了时间,如:14:43:14.539。 上面的类可...

writeademo
01/30
0
0
你真的会使用SimpleDateFormat吗?

在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。 最常用...

HollisChuang's Blog
11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
32分钟前
2
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
43分钟前
3
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
45分钟前
9
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
46分钟前
2
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
51分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部