Java SimpleDateFormat 教程:日期格式化与解析详解
Java SimpleDateFormat 和 DateFormat 类简介:日期格式化与本地化
本文将介绍 Java 中的 SimpleDateFormat
和 DateFormat
类,它们主要用于日期和时间的格式化与解析。这两个类在需要显示或处理 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();
DateFormat
的 getDateInstance
方法需要两个输入参数:第一个参数指定要使用的日期格式样式(如 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的日期格式化类
SimpleDateFormat
与DateFormat
类似。它们之间唯一的主要区别是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的知识。