Как использовать часовой пояс региона с приложением .Net? - PullRequest
2 голосов
/ 01 мая 2010

Я работаю над приложением asp.net mvc. У каждого пользователя свой часовой пояс.

Сейчас я использую «TimeZoneInfo.GetSystemTimeZones» для создания выпадающего списка, чтобы пользователь мог выбрать часовой пояс, и это то, что я храню в своей базе данных
Они такие:
Стандартное время Марокко (00:00:00)
UTC (00:00:00)
Стандартное время по Гринвичу (00:00:00)
...

Я знаю, что php использует другой набор часовых поясов, это "регион часового пояса", например:
Европа / Париж
Europe / London
...

У меня вопрос: есть ли способ играть с часовым поясом региона (например, php) в приложении .NET? Единственный способ, которым я могу придумать, - это привязать каждый часовой пояс региона php к часовому поясу .net.

Кроме того, TimeZoneInfo.GetSystemTimeZones перечисляет все часовые пояса на машине. Отличается ли список между сервером Windows, Windows Vista, Windows XP?

Надеюсь, это имеет смысл, спасибо, ребята

Ответы [ 3 ]

4 голосов
/ 01 мая 2010

Схема имени зоны, используемая php, часто называется базой данных Olson.
Вы можете найти таблицу преобразования для зоны Windows (id) -> Olson DB по адресу http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html

Возможно, вас заинтересует noda-time (хотя он еще не выпущен). Джон Скит немного рассказал об этом в 200-м эпизоде ​​Hanselminutes , и он также будет использовать Olson DB.


В случае, если список / документ на http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml завершен и актуален, вы можете создать простую функцию преобразования для php через

$supplementalData = simplexml_load_file('http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml');

$zones = array();
foreach( $supplementalData->windowsZones->mapTimezones->mapZone as $zi ) {
  $zones[ (string)$zi['other'] ] = (string)$zi['type'];
}

file_put_contents('zoneconvert.php', '<?php function windowszone2olson($winzone) {
  static $zi = '.var_export($zones, true).';
  return isset($zi[$winzone]) ? $zi[$winzone] : false;
}');

Это создаст / перезапишет файл zoneconvert.php, который предоставляет функцию windowszone2olson($winzone). Вы можете сделать более или менее то же самое на конце .net (что, вероятно, лучше).

2 голосов
/ 01 мая 2010

Звучит так, будто вы набираете zoneinfo или имена базы данных Олсона. По сути, это имена, которые использует мир, отличный от Windows:)

Это также то, что Noda Time обычно использует, хотя со временем мы будем поддерживать и имена Windows. К сожалению, Noda Time еще не готова к производству - когда это так, должно быть правильным ответом на ваш вопрос:)

Тем временем, если вы определенно собираетесь использовать только Windows, я думаю, что было бы разумно хранить идентификаторы часовых поясов Windows - убедитесь, что вы используете свойство Id вместо StandardName. переводы между идентификаторами Windows и идентификаторами Олсона в Интернете - но я не знаю, насколько они полны (или актуальны).

1 голос
/ 01 мая 2010

Я бы использовал этот метод, чтобы изначально заполнять таблицу часовых поясов данными, а не извлекать их из коллекции каждый раз. Если что-то изменится, вы можете случайно изменить идентификаторы, которые каждый человек использует в будущем. Вам также не нужно беспокоиться о возможных различиях между ОС ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...