Java SimpleDateFormat 教程:日期格式化与解析详解

Java SimpleDateFormat 和 DateFormat 类简介:日期格式化与本地化

本文将介绍 Java 中的 SimpleDateFormatDateFormat 类,它们主要用于日期和时间的格式化与解析。这两个类在需要显示或处理 Java 日期时间功能时非常有用,它们都位于 java.text 包中。

Java 日期格式化

  • DateFormat 类用于根据提供的特定区域设置(Locale)将日期格式化为字符串。
  • 区域设置(Locale)用于指定地区和语言,使代码更符合用户本地习惯。
  • 世界上不同地区书写日期的方式各不相同。例如,2017年12月31日 在印度可能写成 31-12-2017,但在美国则写成 12-31-2017。
  • DateFormat 类不是线程安全的,建议为每个线程创建独立的实例。

可以使用 DateFormat 类的 getDateInstance()getTimeInstance() 方法创建一个 DateFormat 对象。

Locale loc = new Locale("en", "US");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, loc);

注意:自 Java 19 版本起,构造函数 Locale(String, String) 已被弃用。

推荐使用 Locale.Builder 构建 Locale 对象,例如:

Locale loc = new Locale.Builder().setLanguage("en").setRegion("US").build();

DateFormatgetDateInstance 方法需要两个输入参数:第一个参数指定要使用的日期格式样式(如 DateFormat.DEFAULT),第二个参数是区域设置(Locale)。

使用 format() 方法进行日期格式化

DateFormat 类有一个 format() 方法,负责将 Date 对象格式化为字符串。

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

这段代码将以法语(fr)和法国(FR)地区的格式显示当前日期。

输出示例
3 janv. 2018

使用 getTimeInstance() 方法

这是文章《Java SimpleDateFormat – Java日期格式》的第2部分(共5部分)。

为了创建一个DateFormat实例,我们使用getDateInstance()方法。

为了执行时间格式化,我们需要一个时间实例。我们将使用getTimeInstance()方法来获取时间实例。

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

这段代码将以法语(fr)和法国(FR)地区的格式化时间。

输出

11:03:01

Java SimpleDateFormat: Java的日期格式化类

SimpleDateFormatDateFormat类似。它们之间唯一的主要区别是SimpleDateFormat可以通过本地化支持用于格式化(将日期转换为字符串)和解析(将字符串转换为日期),而DateFormat没有本地化支持。DateFormat是一个抽象类,提供了日期格式化和解析的基本支持。SimpleDateFormat是扩展了DateFormat类的具体类。

我们可以使用SimpleDateFormat构造函数来创建SimpleDateFormat实例。构造函数是一个带参数的构造函数,并且需要一个String模式作为参数。

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

字符串模式是用于格式化日期的模式,输出将按照“MM-dd-yyyy”格式生成。

模式

让我们来看一下应该用于格式化模式的模式语法。

模式字母 日期或时间组件 示例
G 纪元标记 AD
y 年份 2018 (yyyy), 18 (yy)
M 年份中的月份 July (MMMM), Jul (MMM), 07 (MM)
w 年份中的周数 16
W 月份中的周数 3
D 年份中的天数 266
d 月份中的天数 09 (dd), 9(d)
F 月份中的星期几 4
E 星期名称 Tuesday, Tue
u 星期几的数字表示,1代表星期一,2代表星期二,以此类推 2
a 上午或下午标记 AM
H 一天中的小时 (0-23) 12
k 一天中的小时 (1-24) 23
K 12小时制上午/下午的小时 (0-11) 0
h 12小时制上午/下午的小时 (1-12) 12
m 分钟 59
s 秒钟 35
S 毫秒 978
z 时区 Pacific Standard Time; PST; GMT-08:00
Z 时区偏移量(小时,RFC模式) -0800
X ISO格式的时区偏移量 -08; -0800; -08:00

这是文章《Java SimpleDateFormat – Java日期格式》的第3部分(共5部分)。

对于月份,可以根据不同的需求使用不同数量的字母来达到不同的效果。

类型 模式 示例输出
完整月份 MMMM July
缩写月份 MMM Jul
数字月份 MM 07

以下是一些例子:现在让我们来看一些关于日期和时间不同格式的例子。

模式 结果
MM/dd/yyyy 01/02/2018
dd-M-yyyy hh:mm:ss 02-1-2018 06:07:59
dd MMMM yyyy 02 January 2018
dd MMMM yyyy zzzz 02 January 2018 India Standard Time
E, dd MMM yyyy HH:mm:ss z Tue, 02 Jan 2018 18:07:59 IST

使用 SimpleDateFormat() 进行格式化

为了格式化日期,我们需要使用构造函数创建 SimpleDateFormat 的实例,然后使用 format() 方法。

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

这段代码将输出“MM-dd-yyyy”格式的日期。

输出
01-02-2018

这个模式生成“年内的月份”、“月内的日期”和“年份”。字符的类型(和大小写)以及字符的数量都对格式化字符串起到作用。月份用两位数字表示,日期用两位数字表示,而年份用四位数字表示。

这段代码将日期“2018年1月2日”显示为“01-02-2018”。

为了格式化时间,我们在创建 SimpleDateFormat 实例时必须更改模式。

String pattern = "HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

这段代码会输出“HH:mm:ss.SSSZ”格式的时间。

输出
13:03:15.454+0530

这个模式产生了“小时”、“分钟”、“秒钟”、“毫秒”以及“时区偏移(按照RFC模式)”。

这段代码将时间显示为“13:03:15.454+0530”。

使用 parse() 函数

这是文章《Java SimpleDateFormat – Java日期格式》的第4部分(共5部分)。

Java SimpleDateFormat:字符串解析为日期(Parse)

在Java中,将字符串转换为java.util.Date实例的过程称为“解析”(Parse)。我们可以使用SimpleDateFormat类的parse()方法来实现这一功能。要将字符串成功解析为日期对象,我们需要创建一个SimpleDateFormat实例,并在其构造函数中传入一个符合字符串格式的模式。

解析日期字符串示例

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("12-01-2018");
System.out.println(date);

上述代码将输出一个日期(2018年12月1日),但没有指定时间部分。

输出结果
Sat Dec 01 00:00:00 IST 2018

解析时间字符串示例

现在,让我们来看一个使用SimpleDateFormat解析时间字符串的示例。

String pattern = "HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("22:00:03");
System.out.println(date);

这段代码将输出一个只包含时间(22:00:03)的日期对象,但没有指定日期部分。

输出结果
Thu Jan 01 22:00:03 IST 1970

由于我们没有在模式中指定日期信息,程序会将时间视为“纪元时间”(即,从1970年1月1日开始计算)。

使用Locale进行日期格式化

在之前的日期格式化部分,我们已经探讨了如何使用Locale(地区设置)来影响日期和时间的显示格式。Locale是基于特定地区或语言环境的。

String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, new Locale("fr", "FR"));
Date date = simpleDateFormat.format(new Date());
System.out.println(date);

这段代码将以法语(fr)和法国(FR)地区的格式显示当前的日期和时间。

输出结果

2018年1月2日 14:51:02.354+0530

根据提供的区域设置,法语中的日期和月份命名方式如下:mardi是“星期二”,janvier是“一月”。

结论

在这篇文章中,你学习了关于Java的SimpleDateFormat和DateFormat的知识。

参考资料:

bannerAds