Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
上一节 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 | 文字形式 |