【问题标题】:Android Timezone Ids are not matching with System Timezone Ids issueAndroid 时区 ID 与系统时区 ID 问题不匹配
【发布时间】:2014-03-30 06:37:35
【问题描述】:

我正在研究 Android 中的时区概念。

我想通过从应用程序的应用变量中获取时区来更改 Android 平板电脑的时区。我将系统时区作为变量值,即像

Dateline Standard Time
UTC-11
Samoa Standard Time
Hawaiian Standard Time
Alaskan Standard Time  
Pacific Standard Time (Mexico)
Pacific Standard Time
US Mountain Standard Time
Mountain Standard Time (Mexico)
Mountain Standard Time
Central America Standard Time
Central Standard Time
Central Standard Time (Mexico)
Canada Central Standard Time
SA Pacific Standard Time

从 Android 案例中,我得到的时区 ID 类似于

 Africa/Harare
 Africa/Johannesburg
 Africa/Kigali
 Africa/Lubumbashi
 Africa/Lusaka
 Africa/Maputo
 Africa/Maseru
 Africa/Mbabane
 Africa/Tripoli
 Asia/Amman
 Asia/Beirut
 Asia/Istanbul
 Asia/Jerusalem
 Asia/Nicosia
 Asia/Tel_Aviv
 CAT
 EET
 Egypt
 Etc/GMT-2
 Europe/Chisinau
 Europe/Helsinki             

我的代码是

 if (mCalendar != null) {
         mCalendar = Calendar.getInstance();
     }
     else
     {               
         String[] allTimeZones = TimeZone.getAvailableIDs();
         Arrays.sort(allTimeZones);
         for (int i = 0; i < allTimeZones.length; i++) {
         System.out.println(allTimeZones[i]);
         }  

        TimeZone tz = TimeZone.getTimeZone(String.valueOf(Jordan Standard Time));           
         mCalendar = Calendar.getInstance(tz);  
         String name = tz.getID();
         System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " + name);                        
     }

由于应用程序中的“约旦标准时间”是可变的,因此与平板电脑可用 ID 的时区不同,时区不会改变。

如果我手动将时区替换为“非洲/的黎波里”,则时区将替换为该时区。

我现在的问题是我想将系统时区转换为平板电脑时区 ID 并将其显示在 Android 应用程序中。

【问题讨论】:

    标签: android datetime timezone


    【解决方案1】:

    如果您从安卓手机更改时区,请使用此功能,即显示 GMT 时间。

    public static String GetDateForGMTDate(String dateString) {
            SimpleDateFormat formatter = new SimpleDateFormat(
                    "yyyy-mm-dd");
            SimpleDateFormat formatter1 = new SimpleDateFormat(
                    "yyyy-mm-dd");
            Date date = null;
            try {
    
                date = formatter.parse(dateString);
                System.out.println(date);
                System.out.println(formatter.format(date));
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                Log.i("Time zone", "gettime=" + cal.getTime());
                cal.add(Calendar.MINUTE, (-1 * getTimeZoneDifference()));
                Log.i("Time zone", "after gmt +gettime=" + cal.getTime());
                date = cal.getTime();
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            return formatter1.format(date);
        }
    
    
    
    public static final int getTimeZoneDifference() {
            long currentTime = System.currentTimeMillis();
    
            int gmtcurrentOffset = TimeZone.getDefault().getOffset(currentTime);
            int gmtOffset = TimeZone.getTimeZone("GMT").getOffset(currentTime);
            int minuteDifference = (((gmtOffset - gmtcurrentOffset) / 1000) / 60);
            return minuteDifference;
        }
    

    使用第一个函数并将任何带有 yyy-mm-dd 格式的日期作为字符串传递。并且该函数将返回 gmt formate 实时日期时间。

    我已经用过了。 它工作正常。我希望它对你有用。

    【讨论】:

    • 我需要从通用变量中获取时区并更改相对于该时区的时间,而不是使用 Calendar.getinstance() 值的日期。
    • @kumarsu np。你可以从变量中获取它。你可以使用第二种方法。这是你的变量时区和 GMT 时区之间的差异。
    • 应该给出一个输出以便快速理解
    • @Mahmudul 了解时区知识就足够了。
    • 是的,但是给出代码是一个好习惯。顺便说一句,你能告诉我 -1 分钟吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2011-12-14
    • 2019-06-14
    • 2020-10-01
    • 1970-01-01
    • 2020-02-16
    • 2015-06-05
    相关资源
    最近更新 更多