根据GMT值计算时区-Android




在android表单中,我接受用户的GMT值(偏移量(,例如+5:30,+3:00。
根据这个值,我想计算时区,即"印度/德里"。

关于如何做的任何想法。。。。。。Plzz

如果您已经有一个特定的时刻,在这个时刻偏移是有效的,您可以这样做:

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

(据我所知,印度/德里不是有效的地区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+。

许多时区id可以具有相同时区偏移量

通常,时区ID和时区偏移量之间的关系是多对一的,即多个时区ID可以具有相同的时区偏移量。事实上,由于DST,时区ID可以具有两个时区偏移,例如,时区ID的时区偏移";欧洲/伦敦";是"+00:00";以及"+01:00";分别在夏天和冬天。

除此之外,正如Ole V.V.在以下评论中所提到的,也有一些国家的统治者/政治家多次改变时区偏移的情况:

时区ID和时区偏移之间的关系是多对一…如果您正在考虑某个时间点,则是正确的。如果回顾历史,真的是多对多。

因此,考虑到夏令时和这些历史事件,我们可以说时区ID和时区偏移之间的关系是多对多的。

使用现代日期时间API java.time的解决方案:

您可以遍历ZoneId.getAvailableZoneIds()来过滤和收集ZoneId,其ZoneOffset等于使用输入偏移字符串创建的ZoneOffset

演示:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getTimeZoneId("+5:30"));
        System.out.println(getTimeZoneId("-5:00"));
    }
    static List<String> getTimeZoneId(String input) {
        List<String> list = new ArrayList<>();
        // Convert +5:30 to +05:30; similarly, -5:00 to -05:00
        String[] arr = input.split(":");
        if (arr.length == 2) {
            input = arr[0].substring(0, 1) + String.format("%02d", Integer.parseInt(arr[0].replaceAll("\D", ""))) + ":"
                    + arr[1];
            ZoneOffset offset = ZoneOffset.of(input);
            Instant now = Instant.now();
            list = ZoneId.getAvailableZoneIds()
                    .stream()
                    .filter(tzId -> ZoneId.of(tzId).getRules().getOffset(now).equals(offset))
                    .collect(Collectors.toList());
        }
        return list;
    }
}

输出:

[Asia/Kolkata, Asia/Colombo, Asia/Calcutta]
[America/Panama, America/Chicago, America/Eirunepe, Etc/GMT+5, Mexico/General, America/Porto_Acre, America/Guayaquil, America/Rankin_Inlet, US/Central, America/Rainy_River, America/Indiana/Knox, America/North_Dakota/Beulah, America/Monterrey, America/Jamaica, America/Atikokan, America/Coral_Harbour, America/North_Dakota/Center, America/Cayman, America/Indiana/Tell_City, America/Mexico_City, America/Matamoros, CST6CDT, America/Knox_IN, America/Bogota, America/Menominee, America/Resolute, SystemV/EST5, Canada/Central, Brazil/Acre, America/Cancun, America/Lima, America/Bahia_Banderas, US/Indiana-Starke, America/Rio_Branco, SystemV/CST6CDT, Jamaica, America/Merida, America/North_Dakota/New_Salem, America/Winnipeg]

在线演示

注意:正则表达式模式D指定非数字字符。

跟踪:日期时间了解有关现代日期时间API的更多信息。


*无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API。

如果我正确解释了你的问题,那么试试这个,

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));

在这里你可以添加你的偏移量。看看这对你有没有帮助。

相关内容

  • 没有找到相关文章