文档章节

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

人觉非常君
 人觉非常君
发布于 06/22 02:32
字数 528
阅读 20
收藏 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

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

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

西红柿的眼泪
2016/07/12
36
0
jdk8中新的获取时间的方式

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

writeademo
01/30
0
0
线程安全日期格式化操作的几种方式

线程安全日期格式化操作的几种方式 由于 是非线程安全的,因此在多线程并发情况下日期格式化时需要特别注意。下面记录几种格式化的方式: 线程不安全的处理方式 这种方式会报如下异常: 方式...

无声胜有声
2017/03/31
0
0
新款时间日期API已上线

历史 早期,Java 对时间和日期的使用往往重度依赖 java.util.Date和java.util.Calendar。 可惜的是,这2个api 本身不够健壮,有类似线程不安全等诸多问题,于是乎2000年左右,市面上出现了很...

Garrry
2016/01/18
126
0
LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)

本文阅读时间5分钟 看到网上好像关于Java8提供的新时间包的示例几乎都是关于新类和,这些类的互相转换。 很诧异没有看到与的互相转换。 那就让我来提供一个示例吧。 转换示例 LocalDate转Str...

三汪
2017/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ReentrantLock_可重入

package cunrent;import java.util.Calendar;import java.util.concurrent.locks.ReentrantLock;public class TestReentrantLock { public static void main(String[] args......

noteman
44分钟前
2
0
CentOS7下安装mysql5.7

1、安装YUM Repo 由于CentOS 的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件。 wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 然后进行repo的安...

JungleKing
52分钟前
2
0
DevExpress v18.1新版亮点——DevExtreme篇(三)

用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容。本文将介绍了DevExtreme JavaScript Controls v18.1 的新功能,快来下载试用新版本!点击下载...

Miss_Hello_World
52分钟前
1
0
LoadRunner 安装

如果安装LoadRunner 11时弹窗提示"Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误。键入命令 / ? 可获得帮助信息'"。或者弹窗提示"此计算机缺少 vc2005_sp1_wit...

ww1234
今天
1
0
两个时间段相隔自然月Util

public class DateUtil { public static int getDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calend......

木九天
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部