1. 程式人生 > >java時間戳 時間格式轉換與時差

java時間戳 時間格式轉換與時差

時間戳程式碼

protected static Format format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
 public static void printSysProperties(){
     Properties props=System.getProperties(); 
     Iterator iter=props.keySet().iterator(); 
     while(iter.hasNext()){ 
     String key=(String)iter.next(); 
     System.out.println(key+" = "+ props.get(key)); 
     } 
 }
  
 /**
  * timeZoneOffset表示時區,如中國一般使用東八區,因此timeZoneOffset就是8
  * @param timeZoneOffset
  * @return
  */
 public String getFormatedDateString(int timeZoneOffset){
     if (timeZoneOffset > 13 || timeZoneOffset < -12) {
         timeZoneOffset = 0;
     }
     TimeZone timeZone;
     String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);
     if (ids.length == 0) {
         // if no ids were returned, something is wrong. use default TimeZone
         timeZone = TimeZone.getDefault();
     } else {
         timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000, ids[0]);
     }
  
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     sdf.setTimeZone(timeZone);
     return sdf.format(new Date());
 }
  
 public static String getFormatedDateString(String _timeZone){
     TimeZone timeZone = null;
     if(StringUtils.isEmpty(_timeZone)){
         timeZone = TimeZone.getDefault();
     }else{
         timeZone = TimeZone.getTimeZone(_timeZone);
     }
   
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH時mm分ss秒");
     sdf.setTimeZone(timeZone);
     //TimeZone.setDefault(timeZone);
     return sdf.format(new Date());
}
 
 public static void main(String args[]){
     System.out.println(getFormatedDateString(""));
     System.out.println(getFormatedDateString("Asia/Shanghai"));
     System.out.println(getFormatedDateString("Japan"));
     System.out.println(getFormatedDateString("Europe/Madrid"));
     System.out.println(getFormatedDateString("GMT+8:00"));
  
     printSysProperties();
 }

時間區域和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  
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");  
System.setProperty("user.timezone","Asia/Shanghai");
如果沒有一個可用的時間區域ID適合你,那麼就你可以建立一個自定義TimeZone 使用java.util.TimeZone 類的 setDefault 方法將它設定為預設的時間區域----就象我先前在ItsInitializer 類中所做的操作一樣。 

記住,在J2SE中,大多數日期和時間相關的類都包含時間區域資訊,包括那些格式類,如java.text.DateFormat, 因此它們都會被JVM的預設時間區域所影響。然而,在你建立這些類的例項時,你能為它們確保正確的時間區域資訊,使得你可以更容易來設定整個JVM的預設時間區域。並且一旦設定好,就可以確保所有的這些類都將使用同一個預設的時間區域。 
轉載至:http://my.oschina.net/hulubo/blog/40888