如果你的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。这个时区是人系统的时区设置里捕获的。你可以看见,日期是以那个地区的用户期望的格式显示的。让我们等一下来看看时区的概念。