Customizing Formats

Version note:

此日期和时间部分使用java\.util包中的日期和时间 API。 JDK 8 版本中提供的java\.time API 提供了一个全面的日期和时间模型,该模型对java\.util类进行了重大改进。 Date Time路径中描述了java\.time API。 旧版日期时间代码页面可能特别有趣。

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

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

About Patterns

创建SimpleDateFormat对象时,请指定StringPattern。PatternString的内容确定日期和时间的格式。有关 Pattern 语法的完整说明,请参见日期格式 Pattern 语法中的表。

以下代码根据传递给SimpleDateFormat构造函数的 PatternString格式化日期和时间。 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时由上一个代码示例生成的输出:

自定义日期和时间格式

PatternOutput
dd.MM.yy30.06.09
yyyy.MM.dd G'at'hh:mm:ss z太平洋时间 2009 .06.30 AD at 08:29:36
EEE,MMM d,'yy2009 年 6 月 30 日,星期二
h:mm a8:29 PM
H:mm8:29
H:mm:ss:SSS8:28:36:249
K:mm a,z8:29 AM,PDT
yyyy.MMMMM.dd GGG hh:mm aaa2009.AD.June.30 AD 08:29 AM

Pattern 和语言环境

SimpleDateFormat类是对语言环境敏感的。如果不使用Locale参数实例化SimpleDateFormat,它将根据默认的Locale格式化日期和时间。Pattern 和Locale都确定格式。对于相同的 Pattern,如果Locale变化,则SimpleDateFormat可能会格式化日期和时间。

在下面的示例代码中,Pattern 被硬编码在创建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

日期格式 Pattern 的语法

您可以从下表中的符号列表设计日期和时间的格式格式:

SymbolMeaningPresentationExample
Gera designatorTextAD
yyearNumber2009
M一年中的一个月Literals 和数字7 月&07
d每月的一天Number10
h上午/下午(1-12)小时Number12
H一天中的小时(0-23)Number0
m一小时内Number30
s分钟Number55
SmillisecondNumber978
E星期几TextTuesday
D一年中的一天Number189
F每月的星期几Number2 (7 月第二个星期三)
w一年中的一周Number27
W每月的周Number2
aam/pm markerTextPM
k一天中的小时(1-24)Number24
K上午/下午(0-11)的小时Number0
ztime zoneText太平洋标准时间
'为文本转义Delimiter(none)
'single quoteLiteral'

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

您指定的符号字母数量也决定了格式。例如,如果“ zz”Pattern 导致“ PDT”,则“ zzzz”Pattern 将生成“太平洋夏令时”。下表总结了这些规则:

Presentation符号数Result
Text1 - 3缩写形式(如果存在)
Text>= 4full form
Number要求最少位数较短的数字用零填充(一年中,如果“ y”的计数为 2,则年份将被截断为 2 位数字)
Literals 和数字1 - 2number form
Literals 和数字3text form