2017-08-27 239 views
-1

我有一個Android應用程序,它接收來自我的服務器的格式爲「MM-dd-yyyy HH:mm:ss」的字符串。我想將此字符串轉換爲UTC時間的Date對象,因爲字符串中的時間是UTC。我已經檢查幾個類似的問題,但並沒有發現我的答案如何將字符串轉換爲UTC/GMT時區的日期

這裏是我使用的是什麼目前:

SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); 
      Date date = new Date(); 
      try { 
       date = format.parse(itemContent [3]); 
       entity.setValidTill(date); 
      }catch (Exception e){ 

      } 

但是當我打印該日登錄它的作用是顯示它作爲:

太陽8月27日15:00:00 GMT + 04:00 2017年

我希望它是:

太陽8月27日15:00:00 GMT 00:00 2017年

因此,這裏的主要問題是如何獲得的DateTime使用與上面格式的字符串UTC?

編輯:

只要把它在一個更好的環境。我試圖讓用戶看到當前日期時間&保存在服務器中的日期時間之間的差異。所以我的解決方案是爲用戶&比較服務器時間(這是gmt),所以每個人都看到相同的區別,無論他們的時區。用C#,你可以得到DateTime.UtcNow而用java我無法找到一個替代

+0

['DateFormat.setTimeZone(時區)'](https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat。html#setTimeZone-java.util.TimeZone-)(解析之前)。 –

+0

打印日期或堅持它是你的問題? – alirabiee

+0

請檢查我的編輯。我已經解釋了一下,我打算如何處理這個問題 – Cobra47

回答

1

簡單地說,你的問題實在是一個重複很多其他的......

您正在使用現在已成爲遺留的麻煩的舊日期時間類,由java.time類代替。

解析輸入字符串爲LocalDateTime,因爲它缺少任何指示符offset-from-UTCtime zone

定義一個格式器來解析你的輸入字符串。

String input = "08-27-2017 15:00:00" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM-dd-uuuu HH:mm:ss") ; 
LocalDateTime ldt = LocalDateTime.parse(input , f) ; 

ldt.toString():2017-08-27T15:00

一個LocalDateTime的時間表,只有各種可能的時刻,一個大概的瞭解了一下。沒有偏移(或時區)的上下文沒有意義。

如果您確定輸入的目的是爲UTC,請將常量ZoneOffset.UTC指定爲OffsetDateTime

OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC) ; 

odt。的toString():2017-08-27T15:00Z

來計算時刻和當前時刻之間的增量,在你的時間跨度,或Duration爲更細的粒度使用Period類粗粒度。這兩個類都以PnYnMnDTnHnMnS的標準ISO 8601格式生成字符串。

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC) ; 
Duration d = Duration.between(odt , now) ; 

now.toString():2017-08-27T21:16:56.396Z

d.toString():PT6H16M56.396S

見本code run live at IdeOne.com

在上面看到的標準字符串中,ZZulu的縮寫,意思是UTC。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

0

只需添加代碼的第一行下此代碼:

format.setTimeZone(TimeZone.getTimeZone("UTC")); 
+0

來自服務器的日期時間已經是UTC。因此設置時區會在我的時區添加3個小時 – Cobra47