文档章节

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

人觉非常君
 人觉非常君
发布于 06/22 02:32
字数 528
阅读 17
收藏 0
点赞 0
评论 0

两者最大的区别是,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

共有 人打赏支持
人觉非常君
粉丝 4
博文 31
码字总数 19829
作品 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
java8-DateTimeFormatter(下完这场雨)

java.time.format.DateTimeFormatter 与 java.util.DateFormat class相比,它是线程安全的 /** * localdate to string */ @Test public void testDateFormatter() { LocalDate date = LocalD......

writeademo
07/15
0
0
SimpleDateFormat线程不安全示例及其解决方法

我们可以用java.text.SimpleDateFormat类完成日期的转换和格式化操作,如: 但是,同时,我们也能从java.text.SimpleDateFormat类的javadoc中看到如下一句话。 Date formats没有同步。 建议为...

王孟君
2016/11/20
73
0
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
关于时间转换 SimpleDateFormat 的使用的问题

最近一段时间在做一个项目,项目中使用了大量的额时间格式转换,为了方便,就提取了一个时间操作的工具类,由于使用过于频繁,且处于压力测试,每个不到三秒,甚至毫秒级的去调用时间工具类里...

涩郎
2017/03/06
0
0
java8-LocalDate类

LocalDate类使用ISO日历表示年、月、日。 LocalDate.now(); 获取系统当前日期 LocalDate.of(int year,int month,int dayOfMonth); 按指定日期创建LocalDate对象 getYear(); 返回日期中的年份...

FantJ
2017/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
15分钟前
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
28分钟前
14
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
40分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
45分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
今天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
今天
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部