[英]How to convert a string to date with UTC/GMT timezone
我有一個Android應用程序,它從我的服務器接收以下格式的字符串:“ MM-dd-yyyy HH:mm:ss”。 我想將此字符串轉換為以UTC為時區的Date對象,因為字符串中的時間為UTC。 我已經檢查了幾個類似的問題,但沒有找到答案
這是我目前正在使用的:
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){
}
但是,當我用Log打印該日期時,它顯示為:
周日八月27 15:00:00 GMT + 04:00 2017
我希望它是:
周日八月27 15:00:00 GMT 00:00 2017
所以這是主要問題,如何使用上述格式的字符串為UTC獲取DateTime?
編輯:
只是把它放在一個更好的環境中。 我試圖讓用戶看到當前日期時間與服務器中保存的日期時間之間的差異。 所以我的解決方案是獲取用戶的gmt時間並與服務器時間(gmt)進行比較,這樣每個人都可以看到相同的差異,而不管他們的時區如何。 使用C#可以獲取DateTime.UtcNow,而使用Java找不到替代方法
簡而言之,由於您的問題實際上是許多其他問題的重復……
您正在使用麻煩的舊日期時間類,這些類現在已被遺留,由java.time類取代。
將您的輸入字符串解析為LocalDateTime
因為它沒有任何偏離UTC或時區的指示。
定義一個格式化程序以解析您的輸入字符串。
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
要計算該時刻與當前時刻之間的增量,請使用Period
類獲取時間跨度上的較粗粒度,或使用Duration
獲取更細粒度。 這兩個類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
看到此代碼在IdeOne.com上實時運行 。
在上面看到的標准字符串中, Z
是Zulu
縮寫,表示UTC。
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 。 不需要字符串,不需要java.sql.*
類。
在哪里獲取java.time類?
只需將此代碼添加到代碼的第一行以下:
format.setTimeZone(TimeZone.getTimeZone("UTC"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.