您的位置:

详解Java时间格式化

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示例:

ThreadLocal sdf = 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)。针对不同的场景可以选择不同的时间格式化方式。