2016-07-08 133 views
0

因此,我現在嘗試了幾個小時來將時間戳轉換爲本地日期(CEST)。將UTC時間戳轉換爲本地日期

 Date date = new Date(stamp*1000); 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("CEST")); 
    String myDate = simpleDateFormat.format(date); 

它不工作無論我嘗試在網上查找我總是回來UTC時間......

爲了更好的理解:郵票是long類型,我會一個變量時間戳從服務接收

+0

這應該有所幫助:http://stackoverflow.com/questions/7670355/convert-date-time-for-given-timezone -java – Jens

+0

我嘗試了11個upvotes的建議,因爲您可能已經看到,它不工作 – Nali

+0

嘗試[this](http://stackoverflow.com/questions/19431234/converting-between-java-time-localdatetime-and-java -util-date) –

回答

2

TL;博士

String output = ZonedDateTime.ofInstant (Instant.ofEpochSecond (1_468_015_200L) , ZoneId.of ("Europe/Paris")).toString(); 

詳細

的幾個問題:

  • 您沒有使用proper time zone names
    • 專有名稱格式爲continent/region格式。
    • 媒體中常見的3-4字母縮寫如CEST分別爲而不是真實時區。 避免它們。它們既不標準也不唯一(!)。
  • 您正在使用設計欠佳並且令人困惑的舊式過時日期類。它們已被java.time框架所取代。

如果CEST你的意思是提前在夏季UTC的2小時,然後讓我們Europe/Paris作爲一個例子時區。你的問題缺乏示例數據,所以我將編寫這個示例。

顯然你的輸入是從UTC 1970年第一時間的時代開始的整秒數。該值可以直接使用,不需要繁殖。

ZoneId class表示時區。 Instant是UTC時間線上的一個點,分辨率高達納秒。 A ZonedDateTimeInstant調整爲ZoneId

ZoneId zoneId = ZoneId.of ("Europe/Paris"); 
long input = 1_468_015_200L; // Whole seconds since start of 1970. 
Instant instant = Instant.ofEpochSecond (input); 
ZonedDateTime zdt = ZonedDateTime.ofInstant (instant , zoneId); 

轉儲到控制檯。

System.out.println ("input: " + input + " | instant: " + instant + " | zdt: " + zdt); 

輸入:1468015200 |即時:2016-07-08T22:00:00Z | zdt:2016-07-09T00:00 + 02:00 [歐洲/巴黎]

+0

不喜歡它如何顯示在最後.... – Nali

+0

@Nali你的意思是代表日期時間值的字符串的格式?你的問題沒有提及格式。無論如何,使用'DateTimeFormatter'來生成任何格式的字符串的很多例子都是在Stack Overflow中搜索的。這裏顯示的格式符合ISO 8601標準。您可以指定其他格式或讓java.time自動定位到任何'Locale'。 –

+0

@BasilBourque如評論中所述,OP尚未使用Java 8。我不知道他的約束是什麼,但我想他現在必須處理它。 –

0

您的TimeZone ID很可能是不正確的(很好,不被Java識別)。看來,在這種情況下,TimeZone被評估爲UTC,而不是拋出異常。

試試這個:

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("ECT")); 

Here是提供有關Java的TimeZone和時區ID的列表中的一些信息的頁面。

+0

我試過一切它只會顯示我的UTC時間沒有其他 – Nali

+0

@Nali你什麼意思是完全由一切?你嘗試過「大陸/地區」格式嗎? 'simpleDateFormat.setTimeZone(TimeZone.getTimeZone(「Europe/Brussels」));'例如 –

+0

是的,我也試過,但它總是相同的我得到的UTC日期..... – Nali