2012-04-30 2 views
17

Если у меня есть только название города, как Бангкок или Токио, как я могу поставить параметр часового пояса в [NSTimeZone timeZoneWithName:@"Asia/Tokyo"], где он также имеет континент и слэш перед городом?Как использовать NSTimeZone -timeZoneWithName: с именем города из Rails ActiveSupport?

Я уже пробовал [NSTimeZone timeZoneWithName:@"Tokyo"], он не работает.

ответ

26

Спасибо за ответы, ребята, но это выглядит, как эти названия городов только формат, который Rails "ActiveSupport :: TimeZone" использует. Поэтому мне просто нужно отобразить его обратно. Отображение находится здесь ->http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

Он отображает часовой пояс из Rails «ActiveSupport :: TimeZone» в другой формат, который использует iOS (например, «International Date Line West» => «Pacific/Midway», «Midway Island», => "Pacific/Midway", "Самоа" => "Pacific/Pago_Pago", ...).

Я создал a plist file, содержащий свойство NSDictionary, которое может быть легко использовано для отображения.

Edit: an updated version (с примерами использования) для Rails 3.2

+0

Спасибо за plist. Очень полезно для конвертирования «time_zone» пользователя Twitter. – DavidAWalsh

+2

Вот обновленная версия (с примером использования) для Rails 3.2: https://gist.github.com/rjregenold/5243201 –

0

Вы можете найти набор данных и/или API от http://www.geonames.org/, которые могут быть полезны при решении этой проблемы. У них есть правильный часовой пояс olsen (это то, что называется «Азия/Токио») для огромного количества мест, и вы можете либо загружать, либо пресекать данные самостоятельно, либо использовать свой API для получения того, что вам нужно.

+0

Спасибо, но, к сожалению, данные временного пространства, которые я нашел там (http://download.geonames.org/export/dump/timeZones.txt), находятся под разными названиями из названий городов, которые у меня есть. Поэтому я не могу его использовать. Я отправил ответ, который вы можете проверить. – Hlung

1
NSArray *zones = [NSTimeZone knownTimeZoneNames]; 

Он возвращает весь набор временных интервалов, поддерживаемых вашей системой.

У вас должна быть setTime зона, как показано ниже, которую вы уже пробовали.

[NSTimeZone timeZoneWithName:@"Asia/Tokyo"]; 
+0

Да, я уже это знаю. Но я не могу просто изменить ** Токио ** на ** Азия/Токио **, потому что у меня также есть имена, которые полностью отличаются от того, что я получаю от '[NSTimeZone knownTimeZoneNames];'. – Hlung

5

Если они все в Азии, то почему бы не использовать что-то вроде:

MYCITY=Tokyo 
[NSTimeZone timeZoneWithName:@"Asia/$MYCITY"] 

Если вам нужно больше городов и часовых поясов, вы можете создать статический файл списка текст на основе всех часовых поясов найдено в/usr/share/zoneinfo.

создать файл 'timezones.by.city.txt' со следующим текстом. (Усеченное здесь.)

"Asia/Aden" 
"Asia/Almaty" 
"Asia/Amman" 
"Asia/Anadyr" 
"Asia/Aqtau" 
"Asia/Aqtobe" 
"Asia/Ashgabat" 
"Asia/Ashkhabad" 
"Asia/Baghdad" 
"Asia/Bahrain" 
"Asia/Baku" 
"Asia/Bangkok" 
"Asia/Beirut" 
"Asia/Bishkek" 
... etc. 
"US/Alaska" 
"US/Aleutian" 
"US/Arizona" 
"US/Central" 
"US/Eastern" 
"US/East-Indiana" 
"US/Hawaii" 
"US/Indiana-Starke" 
"US/Michigan" 
"US/Mountain" 
"US/Pacific" 
"US/Pacific-New" 
"US/Samoa" 

Тогда:

MYCITY=Bangkok 
MYTZ=`grep "$MYCITY" ./timezones.by.city.txt` 
[df setTimeZone:[NSTimeZone timeZoneWithName:@"$MYTZ"]] 
+0

Нет, они не все в Азии.И что это за 'grep'? – Hlung

+0

Пожалуйста, объясните больше – Hlung

10

Вы можете увидеть список всех имен часовых поясов (спасибо RJ Regenold!).

NSLog(@"%@", [NSTimeZone knownTimeZoneNames]); 

Надеюсь, это будет полезно для вас.

0
NSString * TimeZoneName=[[NSTimeZone localTimeZone]name]; 
Смежные вопросы