格式化日期和时间

-- Start

预定义格式

不同国家和地区显示日期和时间的方式是不同的, 显然格式化日期和时间和本地的语言环境有密切关系. 利用 DateFormat 类提供的方法, 我们可以很容易的将日期和时间格式化成符合本地语言环境的形式.

格式化日期

下面的例子演示了各个国家和地区是如何显示日期的.

public static void main(String[] args) throws Exception {
	for (Locale locale : Locale.getAvailableLocales()) {
	    DateFormat df = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
	    System.out.println(df.format(new Date()) + "    " + locale.getDisplayName(locale.CHINA));
	}
}
上面的例子使用默认的格式化风格(DateFormat.DEFAULT)来格式化日期, 事实上, DateFormat 类还提供了下列格式化风格.
  • DEFAULT
  • SHORT
  • MEDIUM
  • LONG
  • FULL

下面的表格显示了中国, 美国和日本显示日期的不同.

风格 中国 美国 日本
DEFAULT 2012-5-11 May 11, 2012 2012/05/11
SHORT 12-5-11 5/11/12 12/05/11
MEDIUM 2012-5-11 May 11, 2012 2012/05/11
LONG 2012年5月11日 May 11, 2012 2012/05/11
FULL 2012年5月11日 星期五 Friday, May 11, 2012 2012年5月11日

格式化时间

有了格式化日期的经验, 格式化时间是非常简单的, 我们只需使用 getTimeInstance  来得到 DateFormat 的实例即可.

下面的表格显示了中国, 美国和日本显示时间的不同.

风格 中国 美国 日本
DEFAULT 3:12:36 3:12:36 AM 3:12:36
SHORT 上午3:13 3:13 AM 3:13
MEDIUM 3:13:32 3:13:32 AM 3:13:32
LONG 上午03时13分48秒 3:13:48 AM CDT 3:13:48 CDT
FULL 上午03时14分08秒 CDT 3:14:08 AM CDT 3時14分08秒 CDT


格式化日期和时间

要想格式化日期和时间, 我们只需使用 getDateTimeInstance  来得到 DateFormat 的实例即可.

下面的表格显示了中国,美国和日本显示时间的不同.

风格 中国 美国 日本
DEFAULT 2012-5-11 3:20:08 May 11, 2012 3:20:08 AM 2012/05/11 3:20:08
SHORT 12-5-11 上午3:20 5/11/12 3:20 AM 12/05/11 3:20
MEDIUM 2012-5-11 3:20:53 May 11, 2012 3:20:53 AM 2012/05/11 3:20:53
LONG 2012年5月11日 上午03时34分33秒 May 11, 2012 3:34:33 AM CDT 2012/05/11 3:34:33 CDT
FULL 2012年5月11日 星期五 上午03时35分04秒 CDT Friday, May 11, 2012 3:35:04 AM CDT 2012年5月11日 3時35分04秒 CDT

自定义格式

DateFormat 类提供的方法可以很容易的使我们把日期和时间格式化成符合用户语言习惯的形式, 但是我们并不能自定义格式, 当用户需要特殊格式的时候, 我们应该使 SimpleDateFormat.下面是一个简单的例子.

public static void main(String[] args) throws Exception {
	List locals = new ArrayList(3);
	locals.add(Locale.CHINA);
	locals.add(Locale.US);
	locals.add(Locale.JAPAN);
	
	Date today = new Date(); 
	
	for (Locale locale : locals) {
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd EEE", locale);
	    System.out.println(sdf.format(today) + "    " + locale.getDisplayName(locale.CHINA));
	}
}

运行结果如下:

2012-05-13 星期日     中文 (中国)
2012-05-13 Sunday    英文 (美国)
2012-05-13 日曜日     日文 (日本)
从上面输出结果中我们可以看到, 虽然我们可以自定义格式, 但是 类似星期等这类非数字信息是本地敏感的, 这一点需要注意.

我们可以使用下列字母来自定义日期格式.

Letter  Date or Time Component  Presentation  Examples
G  Era designator  Text  AD
y  Year  Year  1996; 96
M  Month in year  Month  July; Jul; 07
w  Week in year  Number  27
W  Week in month  Number  2
D  Day in year  Number  189
d  Day in month  Number  10
F  Day of week in month  Number  2
E  Day in week  Text  Tuesday; Tue
a  Am/pm marker  Text  PM
H  Hour in day (0-23)  Number  0
k  Hour in day (1-24)  Number  24
K  Hour in am/pm (0-11)  Number  0
h  Hour in am/pm (1-12)  Number  12
m  Minute in hour  Number  30
s  Second in minute  Number  55
S  Millisecond  Number  978
z  Time zone  General time zone  Pacific Standard Time; PST; GMT-08:00
Z  Time zone  RFC 822 time zone  -0800

在把字符串转化成日期的时候, 有一点特别需要注意, 在默认情况下, SimpleDateFormat 采用宽松的方式解析字符串, 虽然4月没有31号, 但是下面的代码并不会出错, 而是解析成5月1号. 如果我们在解析字符串之前调用了 setLenient(false) 方法, 那么下面的代码会抛出异常.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
//sdf.setLenient(false); // 有这行代码, 下面的代码会抛异常
System.out.println(sdf.parse("2012-04-31"));

自定义格式符

DateFormatSymbols 类提供了下列方法来允许我们定制星期,月份等的输出.

setAmPmStrings
setEras
setMonths
setShortMonths
setShortWeekdays
setWeekdays
setZoneStrings

从上一个例子我们可以看到, 我们国家的星期显示为: 星期一 ... 星期日, 如果我想把它们修改成 周一 ... 周日 的形式该怎么办呢?

public static void main(String[] args) throws Exception {
	Date today = new Date(); 
	
	// 默认形式
	SimpleDateFormat sdf = new SimpleDateFormat("E", Locale.CHINA);
	System.out.println("默认形式:   " + sdf.format(today));
	
	
	//自定义形式
	DateFormatSymbols symbols = new DateFormatSymbols(Locale.CHINA);
	symbols.setShortWeekdays(new String[]{"", "周日", "周一", "周二", "周三", "周四", "周五", "周六"});
	
	sdf = new SimpleDateFormat("E", symbols);
	System.out.println("自定义形式: " + sdf.format(today));
}
运行结果如下:

默认形式:   星期一
自定义形式: 周一

--- 更多参见: Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-14
-- Written by ShangBo on 2012-05-11
-- End

你可能感兴趣的:(Java,SE)