如果你的Java 程序向处在不同时区或者不同国家的用户显示时间和日期那么你需要了解Java日期类的一些更加高级的方面在使用Java Date和Calendar类计算定制和解析日期的这篇文章里我们提供了对日期日期数据的格式化日期数据的解析和日期计算的一个概览对于这些概念的深入的理解对于讨论更高级的诸如时区国际化标准格式和SQL日期数据等这些有关日期的问题是关键的
我们在本文中讨论的类将包含javatextDateFormat以及javautilTimeZone和javautilLocate我们还将讨论如何使用一个javautilDate的子类javasqlDate来从Oracle数据库里提取和保存Java日期数据
地区的问题
在我们国际化我们的日期数据以前我们需要进一步的学习Locale类也就是javautilLocaleLocale类的一个实例通常包含国家和语言信息其中的每一个部分都是由基于国际标准化组织(ISO)制定的国家代码ISO-和语言代码ISO-的两字符的字符串构成的
让我们来创建两个Locale实例其中一个对应的是美国英语而另一个对应的是法国法语见表A
表A
import javautilLocale;
public class DateExample {
public static void main(String[] args) {
// Create a locale for the English language in the US
Locale localeEN = new Locale(en US);
Systemoutprintln(Display Name: +
localeENgetDisplayName());
Systemoutprintln(Country: + localeENgetCountry());
Systemoutprintln(Language: + localeENgetLanguage());
// Create a locale for the French language in France
Locale localeFR = new Locale(fr FR);
Systemoutprintln(\nDisplay Name: +
localeFRgetDisplayName());
Systemoutprintln(Country: + localeFRgetCountry());
Systemoutprintln(Language: + localeFRgetLanguage());
// Display the EnglishUS locale in French
Systemoutprintln(\nen Display Name in French: +
localeENgetDisplayName(localeFR));
}
}
在这个例子中我们用getDisplayName方法来显示Locale的一个更易读的文本你还应该注意到我们在最后一次调用getDisplayName的时候我们在对English Locale对象调用getDisplayName的时候同时传递了French Locale对象这允许我们选择显示Locale对象所用的语言让我们用英语显示法语Locale对象的内容下面是这个例子的输出
Display Name: English (United States)
Country: US
Language: en
Display Name: French (France)
Country: FR
Language: fr
en Display Name in French: anglais (étatsUnis)
多个地域的日期格式化
使用javautilLocale和javatextDateFormat类我们就能够格式化日期数据把它显示给在另一个地域的用户比方法国表B中的例子为英语和法语各创建了一个完整的日期格式化器
表 B
import javautilLocale;
import javautilDate;
import javatextDateFormat;
public class DateExample {
public static void main(String[] args) {
// Get the current system date and time
Date date = new Date();
// Get a France locale using a Locale constant
Locale localeFR = LocaleFRANCE;
// Create an English/US locale using the constructor
Locale localeEN = new Locale(en US );
// Get a date time formatter for display in France
DateFormat fullDateFormatFR =
DateFormatgetDateTimeInstance(
DateFormatFULL
DateFormatFULL
localeFR);
// Get a date time formatter for display in the US
DateFormat fullDateFormatEN =
DateFormatgetDateTimeInstance(
DateFormatFULL
DateFormatFULL
localeEN);
Systemoutprintln(Locale: + localeFRgetDisplayName());
Systemoutprintln(fullDateFormatFRformat(date));
Systemoutprintln(Locale: + localeENgetDisplayName());
Systemoutprintln(fullDateFormatENformat(date));
}
}
这个例子的输出是
Locale: French (France)
vendredi octobre h GMT:
Locale: English (United States)
Friday October :: PM EDT
注意这个输出包括了时区信息GMT: 和 PM EDT这个时区是人系统的时区设置里捕获的你可以看见日期是以那个地区的用户期望的格式显示的