Есть ли что-нибудь, что уменьшает список часовых поясов Олсона до удобочитаемого формата для пользовательского интерфейса (например, Календарь Google)?

Я пишу приложение, которое просит пользователя выбрать часовой пояс. Я получаю свой список часовых поясов из базы данных Olson (через NodaTime), но это огромный список с множеством избыточных записей, по крайней мере, для моих целей.

Когда вы создаете событие в Календаре Google, вы можете выбрать часовой пояс из относительно небольшого списка с сортировкой по стране, где это необходимо. Я хотел бы иметь возможность достичь чего-то столь же простого без создания отдельной базы данных, что и этот человек делает.

Поскольку я пишу это на C# MVC плюс JavaScript во внешнем интерфейсе, я ищу библиотеку на любом из этих языков, которая дает мне сокращенный список в удобном для пользователя формате, который я мог бы отобразить в раскрывающемся списке. Есть ли такая вещь или мне нужно создать свою собственную и регулярно обновлять ее, как пример, показанный в гиперссылке?


person Rob Kent    schedule 10.11.2012    source источник
comment
Я обнаружил, что мой вопрос почти идентичен этому: stackoverflow.com/questions/13056759/ Я удаляю свой, если это соглашение, но я оставил это здесь, потому что он содержит дополнительную информацию, которой нет в другом.   -  person Rob Kent    schedule 10.11.2012


Ответы (1)


Два возможных ответа здесь:

  • Информация из файла zone.tab. Как оказалось, только сегодня другой участник отправил список по почте с . hg clone, который использует эти данные. Я еще не смотрел на него, но надеюсь сделать это на выходных — и после небольшого массажа мы, надеюсь, получим его в ветке 1.1.

  • Информация из CLDR. Это предлагает примеры городов для представления пользователю - он предназначен именно для этой цели (даже локализован, я думаю). Однако вам нужно будет интегрировать это с Noda Time самостоятельно; в настоящее время у нас нет кода для этого, и простое освоение CLDR займет некоторое время.

Приносим извинения за то, что это не было решено из коробки, но мы знаем об этом и надеемся дать ответ со временем.

person Jon Skeet    schedule 10.11.2012
comment
Спасибо. CLDR выглядит слишком большим набором инструментов для моего понимания времени :), но код ZoneLocation выглядит интересно. Я собираюсь клонировать его и посмотреть, работает ли он для меня. - person Rob Kent; 10.11.2012
comment
Я клонировал код Мэтта и протестировал его. Это, безусловно, уменьшает список до некоторого порядка, но не создает сокращенный список, который я ищу. GetZonesByCountry(GB) создает семь зон, а мне нужна только одна. GetZonesByCountry(US) выдает 48, тогда как список Календаря Google имеет семь. Я недостаточно хорошо разбираюсь в базе данных tz, чтобы знать, как вы будете ее уменьшать (однозначно), поэтому мне нужно изучить ее еще немного. Спасибо. - person Rob Kent; 10.11.2012
comment
Я предполагаю, что когда tzdb возвращает europe/belfast, europe/london и europe/jersey для Великобритании, это потому, что они являются разными юрисдикциями и потенциально могут иметь разные правила. Потому что у них практически нет разных правил, насколько я знаю. Так что, я думаю, мне нужна «снисходительная» версия, которая выполняет «группировку по набору правил» внутри страны, а также знает, как выбирать наиболее важные, то есть Лондон, а не Джерси. Я сомневаюсь, что это основная проблема NodaTime, а скорее проблема пользовательского интерфейса. - person Rob Kent; 10.11.2012
comment
@RobKent: Судя по моему плохому пониманию правил zoneinfo, похоже, что это псевдонимы, да. Отредактирую свой ответ, чтобы привести пример того, как получить нормализованный набор идентификаторов. (Также добавлю его в кодовую базу в качестве демо...) - person Jon Skeet; 10.11.2012
comment
@RobKent: Хм. Похоже, все не так просто, как я думал. Мы обрабатываем ссылку прозрачно, так что вы по-прежнему получаете зону Европа/Джерси. Посмотрим, как мы можем выставить алиасинг. См. code.google.com/p/noda-time/issues. /detail?id=32 - person Jon Skeet; 10.11.2012
comment
@RobKent: в ветке по умолчанию теперь есть исправление. См. код .google.com/p/noda-time/source/ - person Jon Skeet; 12.11.2012
comment
Спасибо за это, но я до сих пор не уверен, что подсказывает мне, какой из них канонический. Если бы я клонировал ваш последний код, а затем объединил изменение ZoneLocation Мэтта, его метод GetZonesByCountry должен был бы сохранить только канонические? Это правильно? - person Rob Kent; 12.11.2012
comment
@RobKent: я не проверял код Мэтта, но ключи в поиске псевдонимов являются каноническими идентификаторами. - person Jon Skeet; 12.11.2012
comment
Рад видеть, что у кого-то есть такие же опасения. :) Мне тоже хотелось бы как-то представить пользователю упрощенный список, возможно, данные CLDR — это то, что нам действительно нужно? Я не зациклен на zone.tab, я просто подумал, что это может быть полезно. - person Matt Johnson-Pint; 13.11.2012
comment
@RobKent При первом проходе реализации zone.tab я обнаружил несколько ошибок. Попробуйте этот code.google.com/r/mj1856. -noda-time/source/ и вы должны получить только 1 зону для ГБ. Есть 30 для США. Исходный файл находится здесь code .google.com/p/noda-time/source/browse/src/ZoneInfoCompiler/ - person Matt Johnson-Pint; 13.11.2012
comment
@Matt: Спасибо, я вернусь к этому через пару дней и повнимательнее рассмотрю данные. Было бы неплохо найти способ сократить этот список из 30 штатов США до 7, которые показывает Google. - person Rob Kent; 13.11.2012