Java TimeZone

来源:互联网 发布:学而后知不足|成语字典 编辑:程序博客网 时间:2024/05/21 07:48
Java代码  收藏代码
  1. protected static Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  2.   
  3. public static void printSysProperties(){  
  4.     Properties props=System.getProperties();   
  5.     Iterator iter=props.keySet().iterator();   
  6.     while(iter.hasNext()){   
  7.     String key=(String)iter.next();   
  8.     System.out.println(key+" = "+ props.get(key));   
  9.     }   
  10. }  
  11.   
  12. /** 
  13.  * timeZoneOffset表示时区,如中国一般使用东八区,因此timeZoneOffset就是8 
  14.  * @param timeZoneOffset 
  15.  * @return 
  16.  */  
  17. public String getFormatedDateString(int timeZoneOffset){  
  18.     if (timeZoneOffset > 13 || timeZoneOffset < -12) {  
  19.         timeZoneOffset = 0;  
  20.     }  
  21.     TimeZone timeZone;  
  22.     String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);  
  23.     if (ids.length == 0) {  
  24.         // if no ids were returned, something is wrong. use default TimeZone  
  25.         timeZone = TimeZone.getDefault();  
  26.     } else {  
  27.         timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000, ids[0]);  
  28.     }  
  29.   
  30.     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  31.     sdf.setTimeZone(timeZone);  
  32.     return sdf.format(new Date());  
  33. }  
  34.   
  35. public static String getFormatedDateString(String _timeZone){  
  36.     TimeZone timeZone = null;  
  37.     if(StringUtils.isEmpty(_timeZone)){  
  38.         timeZone = TimeZone.getDefault();  
  39.     }else{  
  40.         timeZone = TimeZone.getTimeZone(_timeZone);  
  41.     }  
  42.    
  43.     SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH时mm分ss秒");  
  44.     sdf.setTimeZone(timeZone);  
  45.     //TimeZone.setDefault(timeZone);  
  46.     return sdf.format(new Date());  
  47.   }  
  48.   
  49.    public static void setCNTimeZone(){  
  50.        final TimeZone zone = TimeZone.getTimeZone("GMT+8");  
  51.        TimeZone.setDefault(zone);  
  52.    }  
  53.   
  54. public static void main(String args[]){  
  55.     System.out.println(getFormatedDateString(""));  
  56.     System.out.println(getFormatedDateString("Asia/Shanghai"));  
  57.     System.out.println(getFormatedDateString("Japan"));  
  58.     System.out.println(getFormatedDateString("Europe/Madrid"));  
  59.     System.out.println(getFormatedDateString("GMT+8:00"));  
  60.   
  61.     printSysProperties();  
  62. }  


时间区域和JAVA 
    涉及有关时间区域信息时Java和Solaris很相似。每个时间区域都有一个时间区域ID标识符。在J2SE 1.3 and 1.4中,这个ID是个字符串,是由位于J2SE 安装程序的jre/lib子目录中的tzmappings文件这些ID列表。 J2SE 1.3 仅仅只包含tzmappings文件,但是 J2SE 1.4包含世界不同地区的时间区域数据文件。jre/lib/zi存放着这些文件。在J2SE 1.4里,sun.util.calendar.ZoneInfo从这些文件获取DST规则。在Solaris中, 这些时间区域数据文件是以二进制形式存放的,不是文本文件,因此你不能看它们。 在J2SE 1.4中的时间区域数据文件和在Solaris中是不同的。 

     java.util.TimeZone类中getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。这个默认的时间区域ID是从 user.timezone (system)属性那里得到。如果user.timezone没有定义,它就会尝试从user.country和java.home (System)属性来得到ID。 如果它没有成功找到一个时间区域ID,它就会使用一个"fallback" 的GMT值。换句话说, 如果它没有计算出你的时间区域ID,它将使用GMT作为你默认的时间区域。 

注意,System属性是在java.lang.System类的initProperties方法中被初始化的。这是一个本地方法。因此源代码是不可用的----除非你深入到J2SE分发包中的本地代码库中去研究。然而,在Windows系统中,System 属性是从Windows注册表中被初始化的,而在Linux/Unix中是由环境变量来进行初始化。initProperties方法的Javadoc声明,某些属性"必须保证被定义" 且列出它们。被java.util.TimeZone类的getDefault方法使用的三个System属性中,只有java.home作为一种“保证的”属性在Javadoc中被列出。 

推荐的解决方案 
     因此,你如何确保JAVA能给你正确的时间和日期呢?最好的办法是确认JAVA虚拟机(JVM)的默认TimeZone类是正确的,且是适合你的地理范围(Locale)的。你如何来确保默认TimeZone是正确的且适合的呢?这又是一个新问题了。象大多数处理的问题一样,这个也有许多解决方案。根据java.util.TimeZone.getDefault方法的源代码来看,最好的办法是正确地设置user.timezone属性。在启动JAVA虚拟机时,你能很容易的通过使用 -D 命令 -line 参数的办法来覆盖(override)在java.lang.System.initProperties方法中所设置的值。例如: 
Java代码  收藏代码
  1. java -Duser.timezone=Asia/Shanghai DateTest  

这个命令启动DateTest类,并设置 user.timezone属性到Asia/Shanghai。你也能够通过使用java.lang.System 类的setProperty方法来设置user.timezone 属性: 
Java代码  收藏代码
  1. System.setProperty("user.timezone","Asia/Shanghai");  
如果没有一个可用的时间区域ID适合你,那么就你可以创建一个自定义TimeZone 使用java.util.TimeZone 类的 setDefault 方法将它设置为默认的时间区域----就象我先前在ItsInitializer 类中所做的操作一样。 

记住,在J2SE中,大多数日期和时间相关的类都包含时间区域信息,包括那些格式类,如java.text.DateFormat, 因此它们都会被JVM的默认时间区域所影响。然而,在你创建这些类的实例时,你能为它们确保正确的时间区域信息,使得你可以更容易来设置整个JVM的默认时间区域。并且一旦设置好,就可以确保所有的这些类都将使用同一个默认的时间区域。 

附: 
Date Time Timestamp
0 0
原创粉丝点击