如果你的Java 程序向处在不同时区或者不同国家的用户显示时间和日期,那么你需要了解Java日期类的一些更加高级的方面。在“使用Java
Date和Calendar类计算,定制和解析日期”的这篇文章里我们提供了对日期,日期数据的格式化,日期数据的解析和日期计算的一个概览。对于这些概念的深入的理解对于讨论更高级的诸如时区,国际化标准格式和SQL日期数据等这些有关日期的问题是关键的。
我们在本文中讨论的类将包含Java.text.DateFormat,以及Java.util.TimeZone和Java.util.Locate。我们还将讨论如何使用一个Java.util.Date的子类Java.sql.Date来从Oracle数据库里提取和保存Java日期数据。
地区的问题
在我们国际化我们的日期数据以前,我们需要进一步的学习Locale类,也就是Java.util.Locale。Locale类的一个实例通常包含国家和语言信息。其中的每一个部分都是由基于国际标准化组织(ISO)制定的国家代码ISO-3166和语言代码ISO-639的两字符的字符串构成的。
让我们来创建两个Locale实例,其中一个对应的是美国英语而另一个对应的是法国法语。见表A。
表A |
|
|
import Java.util.Locale;
public class DateExample6 {
public static void main(String[] args) {
// Create a locale for the English language in the US.
Locale localeEN = new Locale("en", "US");
System.out.println("Display Name: " +
localeEN.getDisplayName());
System.out.println("Country: " + localeEN.getCountry());
System.out.println("Language: " + localeEN.getLanguage());
// Create a locale for the French language in France.
Locale localeFR = new Locale("fr", "FR");
System.out.println("
Display Name: " +
localeFR.getDisplayName());
System.out.println("Country: " + localeFR.getCountry());
System.out.println("Language: " + localeFR.getLanguage());
// Display the English-US locale in French
System.out.println("
en Display Name in French: " +
localeEN.getDisplayName(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 (états-Unis)
多个地域的日期格式化
使用Java.util.Locale和Java.text.DateFormat类我们就能够格式化日期数据把它显示给在另一个地域的用户,比方法国。表B中的例子为英语和法语各创建了一个完整的日期格式化器。
表 B |
|
|
import Java.util.Locale;
import Java.util.Date;
import Java.text.DateFormat;
public class DateExample7 {
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 = Locale.FRANCE;
// 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 =
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeFR);
// Get a date time formatter for display in the U.S.
DateFormat fullDateFormatEN =
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeEN);
System.out.println("Locale: " + localeFR.getDisplayName());
System.out.println(fullDateFormatFR.format(date));
System.out.println("Locale: " + localeEN.getDisplayName());
System.out.println(fullDateFormatEN.format(date));
}
}
|
这个例子的输出是:
Locale: French (France)
vendredi 5 octobre 2001 21 h 05 GMT-04:00
Locale: English (United States)
Friday, October 5, 2001 9:05:54 PM EDT
注意这个输出包括了时区信息:GMT-04:00 和 PM EDT。这个时区是人系统的时区设置里捕获的。你可以看见,日期是以那个地区的用户期望的格式显示的。让我们等一下来看看时区的概念。