SimpleDateFormat:一个对位置敏感的格式化和解析日期的实体类。(java.text.SimpleDateFormat包中)
使用方法:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test{
// private static final String SimpleDateFormat = null;2
public static void main(String[] args) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(new Date()));
System.out.println(simpleDateFormat.parse("2018-07-24 19:10:10"));
}
}
- 首先要定义一个日期的pattern模式,即SimpleDateFormat无论格式化日期还是解析日期都是按照这个pattern
- 对于format需要传递一个Date对象,返回String,String会按照pattern生成
- 对于parse需要传递一个按照上面pattern的字符串,传递错误的pattern会返回ParseException异常,传递正确会生成一个Date对象
格式化日期的pattern:
附:格式占位符
G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区
SimpleDateFormat会引发的问题:(SimpleDateFormat是线程不安全的)
1 输出值不对
2 内存泄露
解决办法:
- 定义一个SimpleDateFormat常量,
protect static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
SimpleDateFormat线程不安全是因为SimpleDateFormat在格式化和解析字符串的时候都会通过中间对象Calendar对象进行转换。若有多个线程同时操作Calendar时,后来的线程会覆盖先来的线程数据。
-
新建SimpleDateFormat,即每次使用都新建一个SimpleDateFormat
-
使用ThreadLocal,由于ThreadLocal是线程之间隔离开的,对每个线程都是用ThreadLocal保存,就不会出现线程安全问题。
private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<>(); public static Date formatDate(String date) throws ParseException { SimpleDateFormat dayFormat = getSimpleDateFormat(); return dayFormat.parse(date); } private static SimpleDateFormat getSimpleDateFormat() { SimpleDateFormat simpleDateFormat = simpleDateFormatThreadLocal.get(); if (simpleDateFormat == null){ simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss") simpleDateFormatThreadLocal.set(simpleDateFormat); } return simpleDateFormat; }
-
使用第三方工具包:Joda-Time(推荐)和common-lang包
- jdk1.8中使用LocalDateTime、LocalDate、LocalTime类
- LocalDatetime包含时间和日期
- LocalDate:只包含日期,不包含时间
- LocalTime:只包含时间,不包含日期
最后加一个时间戳转换成时间的代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test{
// private static final String SimpleDateFormat = null;2
public static void main(String[] args) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long time = System.currentTimeMillis();
Date date = new Date(Long.parseLong(String.valueOf(time)));
System.out.println(simpleDateFormat.format(date));
// 简洁版
// System.out.println(simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(time)))));
}
}
引自: