2012-06-22 1 views
4

У меня есть требование, когда мне нужно преобразовать часовой пояс из UTC в конкретный часовой пояс и наоборот, учитывая дневное свечение. Для этого я использую класс java.util.TimeZone. Теперь проблема заключается в том, что существует несколько сотен идентификаторов для часового пояса, которые невозможно отобразить пользователю.Как получить идентификатор TimeZone для указанного кода страны ISO?

В настоящее время мы решили создать список стран и указать временные зоны для выбранной страны. Я не могу получить TimeZone за ISO country code.

Вот код, который я в настоящее время использую для преобразования часовых поясов,

Timestamp convertedTime = null; 
try{ 
System.out.println("timezone: "+timeZone +", timestamp: "+timeStamp); 
Locale locale = Locale.ENGLISH; 
     TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault(); 
     System.out.println("Source timezone: "+destTimeZone); 
     DateFormat formatter = DateFormat.getDateTimeInstance(
        DateFormat.DEFAULT, 
        DateFormat.DEFAULT, 
        locale); 
     formatter.setTimeZone(destTimeZone); 
     Date date = new Date(timeStamp.getTime()); 
     System.out.println(formatter.format(date)); 
     convertedTime = new Timestamp(date.getTime()); 
     /*long sixMonths = 150L * 24 * 3600 * 1000; 
     Date inSixMonths = new Date(timeStamp.getTime() + sixMonths); 
     System.out.println("After 6 months: "+formatter.format(inSixMonths)); 

Мне нужно узнать часовой пояс Id будет использоваться в коде выше для данной страны кода ISO.

Обновление: пробовал много вещей, и ниже код приводит меня к списку часовых поясов с 148 вводами (который по-прежнему большой). Может ли кто-нибудь помочь мне сократить его. Или, предложить какой-либо другой способ либо иметь список укоротить часовые пояса или получить часовые пояса для страны,

Код:

public class TimeZones { 

private static final String TIMEZONE_ID_PREFIXES = 
    "^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*"; 

private List<TimeZone> timeZones = null; 

public List<TimeZone> getTimeZones() { 
    if (timeZones == null) { 
    initTimeZones(); 
    } 

    return timeZones; 
} 

private void initTimeZones() { 
    timeZones = new ArrayList<TimeZone>(); 
    final String[] timeZoneIds = TimeZone.getAvailableIDs(); 
    for (final String id : timeZoneIds) { 
    if (id.matches(TIMEZONE_ID_PREFIXES)) { 
     timeZones.add(TimeZone.getTimeZone(id)); 
    } 
    } 
    Collections.sort(timeZones, new Comparator<TimeZone>() { 
    public int compare(final TimeZone a, final TimeZone b) { 
     return a.getID().compareTo(b.getID()); 
    } 
    }); 
} 

ответ

0

Был в состоянии заставить все работать. Я создал собственную таблицу базы данных со всеми часовыми поясами, появляющимися в ОС Windows и их соответствующими идентификаторами TimeZone. Конверсия выполняется с использованием класса java.util.TimeZone.

Спасибо Namal и Frank за ваши данные.

3

Я думаю ICU4J package поможет.

+0

+1. Гораздо лучше, чем мой (теперь удаленный) ответ –

+0

:). Thnx JB Nizet – namalfernandolk

+1

hI Namal, Спасибо за обмен ссылками, хорошую работу. Так держать. –

0

Вы можете сократить список с hasSameRules() ... это должно уменьшить вам выбор до 50:

итерации через -> файл равно временные зоны -> выбрать наиболее recognizables

страны- список должен иметь около 200 записей с большим количеством неинтересных, таких как Гибралтар или Сент-Мартин ... не нравится эта идея

+0

Эй, Фрэнк, Не могли бы вы поставить немного больше света на том же самом. Я немного смущен, если вы имеете в виду список стран или список часовых поясов и как именно это можно достичь. Благодарю. – Mayank

+0

как функция java.util TimeZone предлагает метод сравнения (hasSameRules), вы можете группировать свои временные коды 690 и уменьшать их до 40-50 распознаваемых ... –

+0

Привет, Frank, Спасибо, что ответили назад. Я попробовал то, что вы упомянули. Но после использования hasSameRules он вернул мне список из 428 часовых поясов. Код ниже, – Mayank

Смежные вопросы