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 | 文本形式 |