文档

Java™ 教程-Java Tutorials 中文版
自定义格式
Trail: Internationalization
Lesson: Formatting
Section: Dates and Times

自定义格式


版本说明: 此日期和时间部分使用 java.util 包中的日期和时间 API。JDK 8 发行版中提供的 java.time API 提供了一个全面的日期和时间模型,它比 java.util 类提供了重大改进。java.time API 在 Date Time 路径中描述。Legacy Date-Time Code 页面可能特别有用。

上一节 Using Predefined Formats 描述了 DateFormat 类提供的格式样式。在大多数情况下,这些预定义格式就足够。但是,如果要创建自己的自定义格式,可以使用 SimpleDateFormat 类。

下面的代码示例演示了 SimpleDateFormat 类的方法。你可以在名为 SimpleDateFormatDemo 的文件中找到示例的完整源代码。

关于模式

创建 SimpleDateFormat 对象时,指定模式 String。模式 String 的内容决定了日期和时间的格式。有关模式语法的完整说明,请参阅 Date Format Pattern Syntax 中的表。

以下代码根据传递给 SimpleDateFormat 构造函数的模式 String 格式化日期和时间。format 方法返回的 String 包含要显示的格式化日期和时间。

Date today;
String output;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat(pattern, currentLocale);
today = new Date();
output = formatter.format(today);
System.out.println(pattern + " " + output);

下表显示了指定 U.S. Locale 时上一代码示例生成的输出:

自定义日期和时间格式
模式 输出
dd.MM.yy 30.06.09
yyyy.MM.dd G 'at' hh:mm:ss z 2009.06.30AD at 08:29:36 PDT
EEE, MMM d, ''yy Tue, Jun 30, '09
h:mm a 8:29 PM
H:mm 8:29
H:mm:ss:SSS 8:28:36:249
K:mm a,z 8:29 AM,PDT
yyyy.MMMMM.dd GGG hh:mm aaa 2009.June.30 AD 08:29 AM

模式和语言环境

SimpleDateFormat 类是语言环境敏感的。如果在没有 Locale 参数的情况下实例化 SimpleDateFormat,它将根据默认的 Locale 格式化日期和时间。模式和 Locale 都决定了格式。对于相同的模式,如果 Locale 不同,SimpleDateFormat 可能会以不同方式格式化日期和时间。

在下面的示例代码中,模式在创建 SimpleDateFormat 对象的语句中进行了硬编码:

Date today;
String result;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat("EEE d MMM yy", currentLocale);
today = new Date();
result = formatter.format(today);
System.out.println("Locale: " + currentLocale.toString());
System.out.println("Result: " + result);

currentLocale 设置为不同的值时,前面的代码示例生成此输出:

Locale: fr_FR
Result: mar. 30 juin 09
Locale: de_DE
Result: Di 30 Jun 09
Locale: en_US
Result: Tue 30 Jun 09

日期格式模式语法

你可以从下表中的符号列表中为日期和时间设计自己的格式模式:

符号 含义 表示 例子
G 时代指示符 Text AD
y Number 2009
M 一年中的月 Text & Number July & 07
d 一月中的天 Number 10
h 上午/下午中的小时(1-12) Number 12
H 一天中的小时(0-23) Number 0
m 一小时中的分钟 Number 30
s 一分钟中的秒 Number 55
S 毫秒 Number 978
E 一周中的天 Text Tuesday
D 一年中的天 Number 189
F 一月中的第几个周期几 Number 2 (2nd Wed in July)
w 一年中的周 Number 27
W 一月中的周 Number 2
a 上午/下午标记 Text PM
k 一天中的小时(1-24) Number 24
K 上午/下午中的小时(0-11) Number 0
z 时区 Text Pacific Standard Time
' 转义文字 分隔符 (none)
' 单引号 字面量 '

不是字母的字符被视为带引号的文本。也就是说,即使它们没有包含在单引号内,它们也会出现在格式化文本中。

你指定的符号字母数也决定了格式。例如,如果“zz”模式导致“PDT”,然后“zzzz”模式生成“Pacific Daylight Time”。下表总结了这些规则:

表示 符号数 结果
Text 1 - 3 缩写形式,如果存在的话
Text >= 4 完整形式
Number 必需的最低位数 较短的数字用零填充(对于年,如果 'y' 的计数为 2,则年份被截断为 2 位数)
Text & Number 1 - 2 数字形式
Text & Number 3 文字形式

Previous page: Using Predefined Formats
Next page: Changing Date Format Symbols