2013-04-22 71 views
1

問題已解決外部設備正在計算和發送非標準的2小時移位時間戳,這非常困惑我並啓動了此線程。 TIMESTAMP本身不受時區,時區從人類可讀形式/轉換隻有當適用。在Java中的不同時區和不同DST之間轉換unix時間戳


我在UTC時區的時間戳(自Unix紀元秒) - 沒有DST(夏令時間)。

我想在「歐洲/布拉格」時區,使用DST時間戳(自Unix紀元秒)。

我曾經認爲Unix時間戳是由未結合的時區,該時區隻影響轉換時間戳人類可讀的格式的過程。但看起來不是這樣。而我試圖轉換它(使用Calendar和TimeZone類)越多,我越感到困惑和迷茫。

預期驗證碼不起作用:

Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC")); 
cal.setTimeInMillis(ts*1000); 
cal.setTimeZone(TimeZone.getTimeZone("Europe/Prague")); 
return cal.getTimeInMillis()/1000; 
+0

這是什麼呢?在每行代碼之間打印cal時會發生什麼? – 2013-04-22 13:23:30

+0

你或許應該說明你是否會有興趣在[喬達時間(HTTP://joda-time.sourceforge。網/)解決方案,因爲我懷疑你會開始接收它們。 – 2013-04-22 13:24:53

+0

@Peter最近的時間戳'1366642620'它返回了同一個 - 沒有轉換髮生。如果我嘗試在UTC和歐洲/布拉格時區打印出PHP中的時間戳,我會得到不同的時間:14:57和16:57 – David162795 2013-04-22 13:40:16

回答

0

您可以方便地在兩個時區之間的轉換是這樣的:

1.Suppose這是在美國東部時區的日期和時間

String value = "2006-11-28 09:45:12"; 
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
df1.setTimeZone(TimeZone.getTimeZone("EST")); 

2.設定該值,並假設它代表EST時區中的日期和時間

Date d = df1.parse(value);  
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
df2.setTimeZone(TimeZone.getTimeZone("CET")); 

3.Formats在CET時區的日期

System.out.println(df2.format(d)); 
+0

我見過類似的例子,但它的輸入格式是(小時,分鐘,秒),而不是unix時間戳。我的問題是我不知道如何從不同的時區加載'unix timestamp'。 Calendar.setTimeinMilis()的行爲就好像它在系統時區中工作,而不是在Calendar對象中設置的時區。 – David162795 2013-04-22 13:34:39

+0

如何獲得實際日期而不是字符串? – 2016-05-02 20:06:03

0

它的行爲我希望

public static void main(String... ignored) { 
    long ts = System.currentTimeMillis()/1000; 
    Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC")); 
    printCalendar(cal); 
    cal.setTimeInMillis(ts * 1000); 
    printCalendar(cal); 
    cal.setTimeZone(TimeZone.getTimeZone("Europe/Prague")); 
    printCalendar(cal); 
} 

public static void printCalendar(Calendar calendar) { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS ZZZ"); 
    sdf.setTimeZone(calendar.getTimeZone()); 
    System.out.println(sdf.format(calendar.getTime())); 
} 

打印

2013/04/22 13:28:06.451 +0000 
2013/04/22 13:28:06.000 +0000 
2013/04/22 15:28:06.000 +0200 
2

這裏是一個示例代碼轉換時期時區之間。

public static long convertTimeZone(long lngDate, String fromTimeZone, 
     String toTimeZone) {   
    Calendar fromTime = Calendar.getInstance(); 
    fromTime.setTimeZone(TimeZone.getTimeZone(fromTimeZone)); 
    fromTime.setTimeInMillis(lngDate); 
    Calendar toTime = new GregorianCalendar(
      TimeZone.getTimeZone(toTimeZone)); 
    toTime.set(Calendar.DATE, fromTime.get(Calendar.DATE)); 
    toTime.set(Calendar.MONTH, fromTime.get(Calendar.MONTH)); 
    toTime.set(Calendar.YEAR, fromTime.get(Calendar.YEAR)); 
    toTime.set(Calendar.HOUR_OF_DAY, fromTime.get(Calendar.HOUR_OF_DAY)); 
    toTime.set(Calendar.MINUTE, fromTime.get(Calendar.MINUTE)); 
    toTime.set(Calendar.SECOND, fromTime.get(Calendar.SECOND)); 
    toTime.set(Calendar.MILLISECOND, fromTime.get(Calendar.MILLISECOND)); 
    LOG.debug("Converted " + fromTime.getTimeInMillis() + " to " 
      + toTime.getTimeInMillis()); 
    SimpleDateFormat sdf = new SimpleDateFormat(
      "dd-MMM-yyyy HH:mm:ss.SSS z");  
    sdf.setTimeZone(TimeZone.getTimeZone(fromTimeZone));   
    SimpleDateFormat sdf1 = new SimpleDateFormat(
      "dd-MMM-yyyy HH:mm:ss.SSS z");  
    sdf1.setTimeZone(TimeZone.getTimeZone(toTimeZone)); 
    LOG.debug("Converted " + sdf.format(fromTime.getTime()) + " to " + sdf1.format(toTime.getTime())); 
    return toTime.getTimeInMillis(); 
} 

輸出:

System.out.println(convertTimeZone(new Date().getTime(),"America/New_York","Asia/Singapore")); 
Converted 1384514879944 to 1384468079944 
Converted 15-Nov-2013 06:27:59.944 EST to 15-Nov-2013 06:27:59.944 SGT 
+0

我已經做了4個多小時。我終於得到了正確的結果。它似乎是java中的一個錯誤,或者是您添加的行,它會將毫秒添加到toTime對象,從而導致從utc到本地時區差不多3個小時。 – xFighter 2016-12-14 18:04:04