2016-04-28 52 views
0

我想從現有日期獲取時區以便將其用於其他日期轉換。有人可以在下面的代碼中回覆更新待辦事項。感謝任何幫助。如何從日期獲取時區

或者只是爲了簡單的是有一些的Java API來我給其0530,並將其返回IST :)

這裏是我的代碼:

import java.text.SimpleDateFormat 
import java.util.*; 
import java.text.DateFormat; 

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
Date date = isoFormat.parse("2016-04-21T00:00:00+0530"); 

//todo print time zone 
//todo here should print IST since date is having +0530 
+0

我想你需要4'Z的那個。 '(「yyyy-MM-dd'T'HH:mm:ssZZZZ)' – Zircon

+1

這是不可能的:多個時區在給定的時刻可以有相同的時間偏移 – assylias

+0

你可能會在這裏找到你的答案:http:/ /stackoverflow.com/questions/1305350/how-to-get-the-current-date-and-time-of-your-timezone-in-java – Akah

回答

4

這是不可能的。 A Date沒有附加時區信息。這只是一個時間點,內部表示爲從UTC時間1970年1月1日開始的毫秒(不包括閏秒)。

4

A java.util.Date沒有時區。這是UTC的純粹時間。解析器將字符串轉換爲內部值。

A java.time.ZonedDateTime(Java 8+)確實有時區。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ"); 
ZonedDateTime dt = ZonedDateTime.parse("2016-04-21T00:00:00+0530", formatter); 
ZoneId zone = dt.getZone(); 

如果運行Java 6或7,請使用backport of the Java SE 8 date-time classes
對於Java 5+,使用Joda-Time library

+0

可悲的是我的項目是在java 7。do java 7給我一些API +0530,它返回IST –

+3

你通常不能從時區獲得時區名稱偏移量,因爲有許多名稱使用相同的偏移量 – Andreas

+1

@RahulBGangwar時區是從UTC開始的偏移量*加上*用於處理異常情況的一組規則,例如夏令時。[時區數據庫](https ://en.wikipedia.org/wiki/List_of_tz_database_time_zones)已讀y列出了共享相同偏移量+05:30的兩個區域。明天可能會有更多。每個人可能有不同的規則。此外,停止使用3-4字母代碼,如「IST」,因爲它們既不標準也不唯一(愛爾蘭標準時間,印度......)。使用正式的定義和歷史名稱,包括「亞洲/科倫坡」,「亞洲/加爾各答」,「歐洲/都柏林」。 –

0

只是回答自己,所以,它可能幫助一些其他人:

我是有作爲輸入可以說,日期字符串:用於計算時區

String startDate = "2016-04-21T00:00:00+0530" 
//i can calculate the timezone offset using 
String offSet = startDate.substring(startDate.length() - 5) //gives +0530 

方法。這裏,我們給上面的偏移計算下面的方法返回的TimeZone對象:

public static TimeZone fetchTimeZone(String offset) { 
     if (offset.length() != 5) { 
      return null 
     } 

     TimeZone tz 

     Integer offsetHours = Integer.parseInt(offset.substring(0, 3)) 
     Integer offsetMinutes = Integer.parseInt(offset.substring(3)) 

     String[] ids = TimeZone.getAvailableIDs() 

     for (int i = 0; i < ids.length; i++) { 
      tz = TimeZone.getTimeZone(ids[i]) 

      long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset()) 
      long minutes = Math.abs(TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset()) % 60) 

      if (hours != offsetHours || minutes != offsetMinutes) { 
       tz = null 
      } else { 
       break 
      } 
     } 
     return tz 
    } 

最後我用的時區從上述方法格式化的任何日期到時區:

SimpleDateFormat timeZonedFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
TimeZone timeZone = fetchTimeZone(offSet) //from above method and offset from first code 
timeZonedFormatter.setTimeZone(timeZone); 
//this timeZonedFormatter can be used to format any date into the respective timeZone 
相關問題