格式化日期和时间

-- 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

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

风格中国美国日本
DEFAULT2012-5-11May 11, 20122012/05/11
SHORT12-5-115/11/1212/05/11
MEDIUM2012-5-11May 11, 20122012/05/11
LONG2012年5月11日May 11, 20122012/05/11
FULL2012年5月11日 星期五Friday, May 11, 20122012年5月11日

格式化时间

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

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

风格中国美国日本
DEFAULT3:12:363:12:36 AM3:12:36
SHORT上午3:133:13 AM3:13
MEDIUM3:13:323:13:32 AM3:13:32
LONG上午03时13分48秒3:13:48 AM CDT3:13:48 CDT
FULL上午03时14分08秒 CDT3:14:08 AM CDT3時14分08秒 CDT


格式化日期和时间

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

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

风格中国美国日本
DEFAULT2012-5-11 3:20:08May 11, 2012 3:20:08 AM2012/05/11 3:20:08
SHORT12-5-11 上午3:205/11/12 3:20 AM12/05/11 3:20
MEDIUM2012-5-11 3:20:53May 11, 2012 3:20:53 AM2012/05/11 3:20:53
LONG2012年5月11日 上午03时34分33秒May 11, 2012 3:34:33 AM CDT2012/05/11 3:34:33 CDT
FULL2012年5月11日 星期五 上午03时35分04秒 CDTFriday, May 11, 2012 3:35:04 AM CDT2012年5月11日 3時35分04秒 CDT

自定义格式

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

public static void main(String[] args) throws Exception {
	List<Locale> locals = new ArrayList<Locale>(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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值