1、SimpleDateFormat类的基本用法
SimpleDateFormat类是Java中常用的时间格式化工具,它可以将Date类型转换成指定格式的字符串,也可以将指定格式的字符串转换成Date类型。
以下是一个简单的代码示例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(new Date()); System.out.println(dateString);
这段代码将当前时间按照"yyyy-MM-dd HH:mm:ss"的格式转换成字符串。
SimpleDateFormat可以支持的格式化选项如下:
- y:年份(例如:2018,18)
- M:月份(例如:01,12,Jan,December)
- d:日期(例如:01,31)
- H:小时(24小时制,例如:00,23)
- m:分钟(例如:00,59)
- s:秒(例如:00,59)
- S:毫秒(例如:000,999)
- E:星期几(例如:Mon,Monday)
- D:一年中的第几天(例如:001,365)
- w:一年中的第几周(例如:01,52)
- k:小时(1~24小时制,例如:1,24)
- K:小时(0~11小时制,例如:0,11)
- z:时区(例如:GMT+08:00)
2、SimpleDateFormat线程安全的问题
SimpleDateFormat是线程不安全的,如果将它用于多线程环境中,可能会出现转换异常的情况,比如字符串转化为期望的日期格式失败。解决这个问题,可以使用ThreadLocal来解决。
以下是一个简单的ThreadLocal示例:
ThreadLocalsdf = new ThreadLocal (){ protected SimpleDateFormat initialValue(){ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; String dateString = sdf.get().format(new Date()); System.out.println(dateString);
这段代码将SimpleDateFormat放在ThreadLocal中,每个线程都有自己的SimpleDateFormat对象,避免了线程并发的问题。
3、Date和Calendar类的格式化
除了可以使用SimpleDateFormat类来进行时间格式化外,还可以使用Date和Calendar类提供的方法来进行格式化。
以下是一个基于Date类的代码示例:
Date date = new Date(); DateFormat dateFormat = DateFormat.getDateInstance(); String dateString = dateFormat.format(date); System.out.println(dateString);
这段代码将当前时间按照默认格式进行了转换。
以下是一个基于Calendar类的代码示例:
Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(calendar.getTime()); System.out.println(dateString);
这段代码将当前时间按照指定格式进行了转换。
4、JSR-310模块中的时间格式化
Java 8之后加入了JSR-310模块,其中就包含了时间格式化的类DateTimeFormatter。相比于SimpleDateFormat,它不仅线程安全,还提供了更多的时间格式选项。
以下是一个基于DateTimeFormatter的代码示例:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String dateString = LocalDateTime.now().format(formatter); System.out.println(dateString);
这段代码将当前时间按照指定格式进行了转换。
5、Java时间格式化的性能对比
在使用时间格式化的过程中,性能也是一个非常重要的因素。下面我们来对比一下各种时间格式化方法的性能。
以下是测试代码:
public static void main(String[] args) { Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); long startTime = System.nanoTime(); for (int i = 0; i < 1000000; i++) { String dateString = simpleDateFormat.format(date); } long midTime = System.nanoTime(); for (int i = 0; i < 1000000; i++) { String dateString = dateTimeFormatter.format(LocalDateTime.now()); } long endTime = System.nanoTime(); System.out.println("SimpleDateFormat:" + (midTime - startTime)); System.out.println("DateTimeFormatter:" + (endTime - midTime)); }
测试结果表明,简单日期格式(SimpleDateFormat)的性能并不如JSR-310模块中的时间格式化(DateTimeFormatter)。针对不同的场景可以选择不同的时间格式化方式。