首页 > 编程笔记 > Java笔记 阅读:15

Java日期时间格式化(DateFormate、SimpleDateFormat和DateTimeFormatter)

JDK 1.8 中,新增了 LocalDate 类、LocalTime 类、LocalDateTime 类等几个日期时间类,根据所用日期类的不同,程序输出结果的格式也有所不同,并且都不太符合常规显示习惯。

因此,需要引入日期时间格式化类,将日期时间转换成指定格式的字符串。例如,将日期“Fri Apr 23 20:50:51 CST 2021”格式转换为“2021-04-23 20:50:51 周五”。

除此之外,实际开发中经常会录入如“1990-01-05”这样的日期字符串,这些日期字符串没有办法进行日期比较以及一些日期运算,因此需要将其转换成日期时间格式进行操作。

Java 中提供了多种方式来实现这些功能,本节将针对常用的日期时间格式化类(DateFormate 类、SimpleDateFormat 类、DateTimeFormatter 类)进行详细讲解。

Java DateFormat类格式化

DateFormat 类是一个抽象类,不能使用关键字 new 来创建对象,可以通过该类中提供的静态方法来获取一个实例对象,可以根据需要的格式选择不同的静态方法,但是不能自定义格式。

DateFormat 类提供了 format()方法来实现将日期时间对象格式化成字符串,同时提供了  parse() 方法来实现将字符串解析成日期时间对象,具体说明如下表所示:

表:DateFormat类对象获取方法及常用格式化方法
分 类 方法 方法描述
对象的获取方法 static DateFormat getDateInstance() 获取具有默认格式化风格和默认语言环境的日期时间格式
static DateFormat getDateInstance(int dateStyle , int timeStyle, Locale locale) 获取具有指定日期格式化风格、指定时间格式化风格和指定语言环境的日期时间格式。其中,格式化风格有以下几种:
SHORT:完全为数字
MEDIUM:较长
LONG:更长
FULL:完全指定
static DateFormat getInstance() 获取日期时间格式化风格都使用 SHORT 风格的格式化器
格式化方法 String format(Date date) 将日期根据指定格式化成字符串
Date parse(String source) 将给定的字符串解析成日期时间对象,如果字符串和格式不匹配,运行时会抛出 ParseException 异常

接下来,通过案例来演示 DateFormat 类对象的获取以及常用方法的使用。
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Demo {
    public static void main(String[] args) {
        System.out.println("-----------日期格式化成指定格式的字符串-----------");
        Date date = new Date();
        DateFormat f1 = DateFormat.getInstance();  // 默认风格,默认语言环境
        System.out.println("默认风格:" + f1.format(date));
       
        f1 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.CHINA);  // 指定风格和中文环境
        System.out.println("FULL风格和中文环境:" + f1.format(date));
       
        f1 = DateFormat.getDateInstance(DateFormat.SHORT);  // 获取SHORT风格的日期格式化器
        System.out.println("SHORT风格:" + f1.format(date));
       
        System.out.println("-----------将字符串解析成日期对象-----------");
        String birth = "2019年10月26日 上午11:11:11";
        try {
            // 自定义格式化器以匹配字符串格式
            DateFormat f2 = new SimpleDateFormat("yyyy年M月d日 上午HH:mm:ss", Locale.CHINA);
            Date date1 = f2.parse(birth);
            System.out.println("转换后的日期:" + date1);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
程序的运行结果如下:
-----------日期格式化成指定格式的字符串-----------
默认风格:4/16/25, 2:50 AM
FULL风格和中文环境:2025年4月16日星期三 协调世界时 上午2:50:08
SHORT风格:4/16/25
-----------将字符串解析成日期对象-----------
转换后的日期:Sat Oct 26 11:11:11 UTC 2019
程序分为两部分:

Java SimpleDateFormat类格式化

SimpleDateFormat 类是 DateFormat 类的子类,可以自定义格式。

SimpleDateFormat 类可以通过 new 关键字来创建对象,同样提供了 format() 方法与 parse() 方法进行日期和字符串之间的转换,其常用方法如下表所示。

表:SimpleDateFormat类常用的构造方法与成员方法
分 类 方法 方法描述
构造方法 SimpleDateFormat(String pattern) 指定日期格式创建一个 SimpleDateFormat 对象
SimpleDateFormat(String pattern, Local local) 指定日期的格式和地区创建一个 SimpleDateFormat 对象,这里的 local 参数对星期显示有关键作用
成员方法 String format(Date date) 将日期根据指定格式化成字符串
Date parse(String source) 将符合格式的字符串转换成日期对象,如果字符串和格式不匹配,运行时会抛出 ParseException 异常

接下来,通过案例来演示 SimpleDateFormat 类常用方法的使用。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        System.out.println("-----------日期格式化成字符串-----------");
        Date date = new Date();
        System.out.println("没有格式化之前的日期:" + date);
        SimpleDateFormat f1;  // 定义地区为中国
        f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EE",Locale.CHINA);
        String strDate = f1.format(date);
        System.out.println("格式化之后:" + strDate);
        SimpleDateFormat f2;  // 定义地区为美国
        f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EE",Locale.US);
        String strDate1 = f2.format(date);
        System.out.println("定义位置为美国来进行格式化:" + strDate1);
        SimpleDateFormat f3;  // 定义地区为默认
        f3 = new SimpleDateFormat("yyyy-MM-dd");
        String strDate2 = f3.format(date);
        System.out.println("只保留年月日格式化:" + strDate2);
        System.out.println("-----------字符串解析成日期对象-----------");
        String birth = "1990-10-10";  // 字符串需要和下边定义的格式一致,否则转换不成功
        SimpleDateFormat f4 = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date birthDate = f4.parse(birth);
            System.out.println("字符串转换成日期:" + birthDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
程序的运行结果如下:
-----------日期格式化成字符串-----------
没有格式化之前的日期:Wed Apr 16 02:53:34 UTC 2025
格式化之后:2025-04-16 02:53:34 周三
定义位置为美国来进行格式化:2025-04-16 02:53:34 Wed
只保留年月日格式化:2025-04-16
-----------字符串解析成日期对象-----------
字符串转换成日期:Wed Oct 10 00:00:00 UTC 1990
程序中,第 12 行按照中国习惯进行格式化声明,第 16 行按照美国习惯进行格式化声明,对比二者格式化结果可以发现,在星期方面差距很大。

注意,格式规则中 yyyy 代表年,MM 代表月,dd 代表日,HH 代表小时(24 小时制),hh 代表小时(12 小时制),mm 代表分钟,ss 代表秒,E 代表星期,S 代表毫秒,D 代表一年中的第几天,w 代表一年中的第几个星期,W 代表一月中的第几星期,a 代表上下午标识。

Java DateTimeFormatter类格式化

Java8 新增的日期时间 API,除了 LocalDate 类、LocalTime 类、LocalDateTime 类以外,还包括用于日期时间格式化的 DateTimeFormatter 类。它与 SimpleDateFormat 类的区别在于:
DateTimeFormatter 类提供了 ofPattern(String pattern) 方法进行格式化设置,参数 pattern 的定义规则是:yyyy 代表年、MM 代表月、dd 代表日、HH 代表 24 小时制的小时、hh 代表 12 小时制的小时、mm 代表分钟、ss 代表秒。

这个类格式化日期有两种形式:
接下来,通过案例来演示使用 DateTimeFormatter 类分别将 LocalDateTime 类型、LocalDate 类型、LocalTime 类型的对象格式化成字符串。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        LocalDateTime datetime = LocalDateTime.now();
        System.out.println("LocalDateTime原始格式:" + datetime);
        // 定义一个格式为 “年-月-日 时:分:秒”
        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 定义一个格式为 “年-月-日”
        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 定义一个格式为“时:分:秒”
        DateTimeFormatter f3 = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println("-----------LocalDateTime的format()方法格式化-----------");
        // LocalDateTime的format方法
        String dateStr = datetime.format(f1);
        System.out.println("yyyy-MM-dd HH:mm:ss格式化后:" + dateStr);
        dateStr = datetime.format(f2);
        System.out.println("yyyy-MM-dd格式化后:" + dateStr);
        System.out.println("-----------DateTimeFormatter的format()方法格式化-----------");
        // DateTimeFormatter的format方法
        dateStr = f1.format(datetime);
        System.out.println("yyyy-MM-dd HH:mm:ss格式化后:" + dateStr);
        dateStr = f2.format(datetime);
        System.out.println("yyyy-MM-dd格式化后:" + dateStr);
        System.out.println();

        LocalDate localDate = LocalDate.now();
        System.out.println("LocalDate原始格式:" + localDate);
        System.out.println("-----------LocalDate的format()方法格式化-----------");
        // LocalDate的格式中只能有年月日
        dateStr = localDate.format(f2);
        System.out.println("yyyy-MM-dd格式化后:" + dateStr);
        System.out.println("-----------DateTimeFormatter的format()方法格式化-----------");
        // DateTimeFormatter的format方法
        dateStr = f2.format(localDate);
        System.out.println("yyyy-MM-dd格式化后:" + dateStr);
        System.out.println();

        LocalTime localTime = LocalTime.now();
        System.out.println("LocalTime原始格式:" + localTime);
        System.out.println("-----------LocalTime的format()方法格式化-----------");
        // LocalTime的格式中不能有年月日
        dateStr = localTime.format(f3);
        System.out.println("HH:mm:ss格式化后:" + dateStr);
        System.out.println("-----------DateTimeFormatter的format()方法格式化-----------");
        // DateTimeFormatter的format方法
        dateStr = f3.format(localTime);
        System.out.println("HH:mm:ss格式化后:" + dateStr);
    }
}
程序的运行结果如下:
LocalDateTime原始格式:2025-04-16T03:00:30.277184
-----------LocalDateTime的format()方法格式化-----------
yyyy-MM-dd HH:mm:ss格式化后:2025-04-16 03:00:30
yyyy-MM-dd格式化后:2025-04-16
-----------DateTimeFormatter的format()方法格式化-----------
yyyy-MM-dd HH:mm:ss格式化后:2025-04-16 03:00:30
yyyy-MM-dd格式化后:2025-04-16

LocalDate原始格式:2025-04-16
-----------LocalDate的format()方法格式化-----------
yyyy-MM-dd格式化后:2025-04-16
-----------DateTimeFormatter的format()方法格式化-----------
yyyy-MM-dd格式化后:2025-04-16

LocalTime原始格式:03:00:30.291438
-----------LocalTime的format()方法格式化-----------
HH:mm:ss格式化后:03:00:30
-----------DateTimeFormatter的format()方法格式化-----------
HH:mm:ss格式化后:03:00:30
需要特别强调的是,LocalDate、LocalTime、LocalDateTime 这 3 种类型的对象格式化成字符串用的都是 DateTimeFormatter 类,但是定义格式的要求不同。其中,LocalDateTime 对象可以使用年月日时分秒,LocalDate 对象中只能有年月日,LocalTime 对象中不能有年月日。

Java DateTimeFormatter类解析字符串

DateTimeFormatter 类可以将日期格式化成字符串,也可以将字符串解析成日期对象,有如下两种形式可以实现:
接下来,通过案例来演示使用 DateTimeFormatter 将字符串格式化成日期对象。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter f3 = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println("-----LocalDateTime类的parse()方法解析字符串-----");
        String dateStr = "2011-01-01 12:12:12";
        LocalDateTime dateTime = LocalDateTime.parse(dateStr,f1);
        System.out.println("LocalDateTime日期格式:" + dateTime);
        System.out.println("-----DateTimeFormatter类的parse()方法解析字符串-----");
        TemporalAccessor dateTime1 = f1.parse(dateStr);
        dateTime = LocalDateTime.from(dateTime1);
        System.out.println("LocalDateTime日期格式:" + dateTime);
        System.out.println("-----LocalDate类的parse()方法解析字符串-----");
        dateStr = "2011-01-11";
        LocalDate date = LocalDate.parse(dateStr,f2);
        System.out.println("LocalDate日期格式:" + date);
        System.out.println("-----LocalTime类的parse()方法解析字符串-----");
        String timeStr = "11:11:11";
        LocalTime time = LocalTime.parse(timeStr,f3);
        System.out.println("LocalTime日期格式:" + time);
    }
}
程序的运行结果如下:
-----LocalDateTime类的parse()方法解析字符串-----
LocalDateTime日期格式:2011-01-01T12:12:12
-----DateTimeFormatter类的parse()方法解析字符串-----
LocalDateTime日期格式:2011-01-01T12:12:12
-----LocalDate类的parse()方法解析字符串-----
LocalDate日期格式:2011-01-11
-----LocalTime类的parse()方法解析字符串-----
LocalTime日期格式:11:11:11
程序中,被解析的字符串格式需和 DateTimeFormatter 对象创建时设置的参数格式保持一致,否则会抛出 DateTimeParseException 异常。

相关文章