Java教程是为JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项的信息,请参阅JDK发行说明。
前面的章节使用预定义格式描述了DateFormat
类提供的格式化样式。在大多数情况下,这些预定义格式已经足够使用。然而,如果你想要创建自定义的格式,你可以使用SimpleDateFormat
类。
以下代码示例演示了SimpleDateFormat
类的方法。你可以在名为SimpleDateFormatDemo
的文件中找到这些示例的完整源代码。
当你创建SimpleDateFormat
对象时,你需要指定一个模式String
。模式String
的内容决定了日期和时间的格式。有关模式语法的详细描述,请参阅日期格式模式语法中的表格。
下面的代码根据传递给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);
以下表格显示了上述代码示例在指定美国Locale
时生成的输出:
模式 | 输出 |
---|---|
dd.MM.yy | 30.06.09 |
yyyy.MM.dd G 'at' hh:mm:ss z | 2009.06.30 AD 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
类是区域设置敏感的。如果你在实例化 SimpleDateFormat
时没有指定 Locale
参数,它会根据默认的 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 | 纪元指示符 | 文本 | 公元 |
y | 年份 | 数字 | 2009 |
M | 年中的月份 | 文本和数字 | 七月 & 07 |
d | 月中的天数 | 数字 | 10 |
h | 上午/下午的小时数 (1-12) | 数字 | 12 |
H | 一天中的小时数 (0-23) | 数字 | 0 |
m | 小时中的分钟数 | 数字 | 30 |
s | 分钟中的秒数 | 数字 | 55 |
S | 毫秒数 | 数字 | 978 |
E | 星期中的天数 | 文本 | 星期二 |
D | 年中的天数 | 数字 | 189 |
F | 月中的星期数 | 数字 | 2 (7月的第二个星期三) |
w | 年中的周数 | 数字 | 27 |
W | 月中的周数 | 数字 | 2 |
a | 上午/下午标记 | 文本 | 下午 |
k | 一天中的小时数 (1-24) | 数字 | 24 |
K | 上午/下午的小时数 (0-11) | 数字 | 0 |
z | 时区 | 文本 | 太平洋标准时间 |
' | 文本转义符 | 分隔符 | (无) |
' | 单引号 | 字面量 | ' |
非字母字符被视为引用文本。也就是说,即使它们没有被单引号括起来,它们也会出现在格式化文本中。
您指定的符号字母数量还决定了格式。例如,如果“zz”模式结果为“PDT”,那么“zzzz”模式将生成“太平洋夏令时”。以下表总结了这些规则:
显示 | 符号数量 | 结果 |
---|---|---|
文本 | 1 - 3 | 缩写形式(如果存在) |
文本 | >= 4 | 完整形式 |
数字 | 需要的最小数字位数 | 较短的数字用零填充(对于年份,如果'y'的计数为2,则年份将截断为2位数) |
文本 & 数字 | 1 - 2 | 数字形式 |
文本 & 数字 | 3 | 文本形式 |