1. 介绍
SimpleDateFormat是Java中非常常用的一个日期格式化类,它可以将日期对象转化成指定格式的字符串,也可以将字符串解析成日期对象。这个类简单易用,但也有一些需要注意的地方,下面我们将从多个方面深入阐述。
2. 正文
1. SimpleDateFormat的常用格式
在使用SimpleDateFormat进行格式化时,需要指定一个格式字符串,下表是一些常用的格式以及它们对应的含义:
格式 | 含义 |
yyyy-MM-dd | 年-月-日 |
yyyy-MM-dd HH:mm:ss | 年-月-日 时:分:秒 |
yyyy/MM/dd HH:mm:ss | 年/月/日 时:分:秒 |
yyyy年MM月dd日 HH时mm分ss秒 | 年月日 时分秒 |
使用方法也非常简单,假设有一个Date对象now:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowStr = sdf.format(now); System.out.println(nowStr);
上述代码将Date对象now格式化成了"年-月-日 时:分:秒"的字符串。
2. SimpleDateFormat的线程安全问题
SimpleDateFormat在多线程环境下,是不安全的。因为SimpleDateFormat中的Calendar对象是非线程安全的,所以多个线程同时调用SimpleDateFormat对象的format方法会出现线程安全问题。在多线程环境下,通常可以使用ThreadLocal来解决这个问题:
private static final ThreadLocalSDF_THREAD_LOCAL = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); public static String format(Date date) { SimpleDateFormat sdf = SDF_THREAD_LOCAL.get(); return sdf.format(date); }
3. SimpleDateFormat的不足之处
SimpleDateFormat虽然能够解决大部分日期格式问题,但仍有其不足之处。例如,对于“星期几”的格式化,SimpleDateFormat无法直接处理。如何解决呢?Java 8引入了DateTimeFormatter,它提供更为灵活的日期格式化功能:
DateTimeFormatter chineseDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E a hh:mm:ss", Locale.CHINA); String formattedDateTime = LocalDateTime.now().format(chineseDateTimeFormatter);
上述代码将日期格式化成了"2022年10月21日 星期五 下午 04:28:15"。
3. 总结
SimpleDateFormat是Java中非常常用的日期格式化类,但其线程安全问题和对于一些日期格式化的不支持,使得它在某些情况下无法满足需求。在Java 8中,我们可以使用DateTimeFormatter来解决这些问题。在使用SimpleDateFormat时,需要注意其格式化字符串,以及多线程环境下的线程安全问题。