-- 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 | 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));
}
运行结果如下:
默认形式: 星期一
自定义形式: 周一