Как вы возвращаете системный часовой пояс в виде строки? - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть приложение, в котором я устанавливаю часовые пояса для разных городов мира. У меня нет проблем с этим, и это прекрасно работает. Когда приложение загружается впервые, оно находит ваше текущее местоположение (широта и долгота) и устанавливает часовой пояс, используя часовой пояс устройства по умолчанию. Мне нужно вернуть часовой пояс по умолчанию в строке, чтобы я мог отобразить его. Я не хочу, чтобы "GMT" или "EDT", я хотел бы его в формате "Америка / Нью-Йорк" или "Европа / Лондон". Есть идеи?

Ответы [ 3 ]

14 голосов
/ 09 декабря 2011

Звучит так, как вы хотите:

NSString *timeZoneName = [[NSTimeZone localTimeZone] name];

Это возвращает мне "Америка / Нью-Йорк", здесь, в часовом поясе EST.

Или, получив любой NSTimeZone *tz, вы можете получить его [tz name], которое является условным названием, которое вы ищете (например, "Азия / Токио" или "Европа / Лондон".

Посмотрите на +[NSTimeZone knownTimeZoneName] список возможных имен.

Надеюсь, это поможет.

0 голосов
/ 09 декабря 2011

Ну, вы предполагаете, что EDT - это тот же часовой пояс, что и America/New_York. Это не так. :) Да, это одно и то же смещение UTC, но что касается вашей системы, они определяются независимо. Между ними нет тесной связи, о которой знает Какао.

Также, если пользователь дает вам EDT, вы возвращаете New_York? Toronto? Panama? Там нет переписки 1: 1. Да, и: EDT даже не уникален для одного смещения UTC. Австралийское восточное летнее время также сокращено EDT, как мне сказали в документации по Какао.

Существует карта [NSTimeZone abbreviationDictionary] между сокращениями и длинными именами, но, опять же, они выбираются произвольно, когда существует более одной ассоциации (например, Нью-Йорк и Панама).

Чего вы пытаетесь достичь в более широком смысле? Какова твоя цель? Скажите нам, и мы сможем предложить альтернативный способ достижения этого. :)

0 голосов
/ 09 декабря 2011

Я не думаю, что есть объект, который автоматически соотносит часовой пояс с физическим местом.

Я вижу, вы пометили эту цель-c, но в C # вы могли бы сделать что-то простое, как это:

public Enum TimeZone
{
    [Description("New York")]
    EDT,
    [Description("Los Angeles")]
    PST
}

public static string GetDescription(Enum value)
{
    FieldInfo fi= value.GetType().GetField(value.ToString()); 
    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
    return (attributes.Length>0)?attributes[0].Description:value.ToString();
}

Я не уверен, насколько легко это перенести в Objective-C, и это требует использования библиотеки отражений в C #.

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