2013-05-11 121 views
-1


在Android窗体中,我接受来自用户的GMT值(偏移量),例如+5:30,+3:00。
从这个值,我想要计算出“印度/德里”的时区。从GMT值计算时区 - Android

就怎么做吧...... Plzz

+3

您必须搜索时区以查找匹配(显然,可能有多个匹配) – 2013-05-11 07:45:03

+0

您甚至知道发生偏移的日期/时间吗?这会至少缩小一点... – 2013-05-11 07:56:17

回答

4

如果您已经在某一特定时刻着该偏移是有效的,你可以做这样的事情:

import java.util.*; 

public class Test { 

    public static void main(String [] args) throws Exception { 
     // Five and a half hours 
     int offsetMilliseconds = (5 * 60 + 30) * 60 * 1000; 
     for (String id : findTimeZones(System.currentTimeMillis(), 
             offsetMilliseconds)) { 
      System.out.println(id); 
     } 
    } 

    public static List<String> findTimeZones(long instant, 
              int offsetMilliseconds) { 
     List<String> ret = new ArrayList<String>(); 
     for (String id : TimeZone.getAvailableIDs()) { 
      TimeZone zone = TimeZone.getTimeZone(id); 
      if (zone.getOffset(instant) == offsetMilliseconds) { 
       ret.add(id); 
      } 
     } 
     return ret; 
    } 
} 

在我的盒子,打印:

Asia/Calcutta 
Asia/Colombo 
Asia/Kolkata 
IST 

(据因为我知道,印度/德里不是有效的zoneinfo ID。)

如果您不知道偏移量有效的时刻,这变得相当困难真的做得不错。这里有一个版本:

public static List<String> findTimeZones(int offsetMilliseconds) { 
    List<String> ret = new ArrayList<String>(); 
    for (String id : TimeZone.getAvailableIDs()) { 
     TimeZone zone = TimeZone.getTimeZone(id); 
     if (zone.getRawOffset() == offsetMilliseconds || 
      zone.getRawOffset() + zone.getDSTSavings() == offsetMilliseconds) { 
      ret.add(id); 
     } 
    } 
    return ret; 
} 

...但是,假设有每个时区只有永远两个偏移的时候,其实时区可以在历史相当大的变化。当然,它也为您提供更广泛的ID。例如,一个小时的偏差包括欧洲/伦敦和欧洲/巴黎,因为在夏季,伦敦在UTC + 1,而在冬季,巴黎在UTC + 1。

+0

+1不错的答案。我可以得到ID,但不知道你必须以毫秒为单位匹配 – Raghunandan 2013-05-11 08:14:53

+0

@Raghunandan:“毫秒匹配”是什么意思?这只是'getOffset'返回一个值的单位... – 2013-05-11 08:23:19

+0

我错过了这个(zone.getOffset(instant)== offsetMilliseconds)部分就是我的意思。 – Raghunandan 2013-05-11 08:25:44

-1

如果我有正确的解释,然后你的问题试试这个任何想法,

final SimpleDateFormat date= 
     new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z"); 
date.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println("GMT time: " + date.format(currentTime)); 

在此你可以添加你所抵消。看看这是否有助于你。

+0

不,这个问题根本不能回答这个问题。 OP不是在谈论文本格式;他正在谈论时区检测。 – 2013-05-11 07:56:42