Борьба с NSDate, форматами и часовыми поясами - PullRequest
0 голосов
/ 24 октября 2011

Дело в том, что я хочу NSDate представление даты 18 июня 1978 года. Я пытался инициировать NSDate как

dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
self.dateFormatter.timeStyle = NSDateFormatterNoStyle;
self.startDate = [dateFormatter dateFromString:@"19/06/78"];
NSLog(@"%@", self.startDate);

Это дает правильную дату, когда iPhone установлен на датский в международных настройках. Он не работает с iPhone, для которого установлены английские / американские настройки.

Обратите внимание на дополнительный день (19), потому что Дания в GMT +1, и я думаю, что NSDate по умолчанию имеет время 23:00:00. Это указывает на то, что я не работаю, как задумано.

Я хочу, чтобы указанная выше дата (18/06/1978) представляла объект NSDate независимо от часового пояса, локали и международных настроек на устройстве.

Как этого добиться?

Изменить:

Так что ответ Оле Бегеманна, похоже, решил мою проблему. Его решение создало правильную дату как на устройстве в международных настройках США, так и в международных европейских настройках. Но когда Apple должна рассмотреть приложение, созданная дата была 17 июня 1978 года. Это имеет смысл, так как я устанавливаю часовой пояс GMT +0000. И Купертино, как GMT -0007 или около того. Так что это даст день раньше.

Итак, чтобы исправить мой вопрос: я хочу 18-06-1978 независимо от локали, часового пояса, в котором устройство физически или в настройках.

Я пытаюсь установить дату начала 18 июня 1978 года и позже в моем приложении отображать дату в виде строки, отформатированной как «780618» (yyMMdd), независимо от часового пояса или места устройства. Это всегда должно быть "780618", так как это ключевая дата начала для моего приложения.

Так что я могу неправильно заняться проблемой. Вместо того, чтобы пытаться использовать одну и ту же дату везде, я, возможно, должен принять данные о часовом поясе и попытаться настроить NSDateFormatter для вывода правильной даты.

Итак, в основном: мне нужен экземпляр NSDate, который форматирует в 780618 везде - в любом часовом поясе с любыми международными настройками устройства.

Как этого добиться?

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Я хочу, чтобы указанная выше дата (18/06/1978) представляла объект NSDate независимо от часового пояса, локали и международных настроек на устройстве.

Это не имеет смысла для NSDate. NSDate всегда представляет один момент времени, поэтому по определению он включает время и часовой пояс, в котором оно находится (или, если быть более точным, он хранит время в GMT; время конвертируется только в другой часовой пояс). для демонстрации). Если вы просто хотите дату, вы должны сделать свое собственное определение времени, например, хранить эти даты со временем полуночи по Гринвичу.

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

Я бы сделал это так:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateComponents setYear:1978];
[dateComponents setMonth:6];
[dateComponents setDay:18];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [calendar dateFromComponents:dateComponents];
NSLog(@"%@", date);
0 голосов
/ 24 октября 2011

Вы можете сделать так:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

// Set the locale to en_US_POSIX. This makes the date formatter respect
// the format string regardless of the user's locale.
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:locale];
[locale release];

// We want the date in the user's current time zone.
[formatter setTimeZone:[NSTimeZone localTimeZone]];

[formatter setDateFormat:@"dd/MM/yy"];

NSDate *date = [formatter dateFromString:@"18/06/78"];

[formatter release];

NSLog(@"%@", date);

То, что дата показывается следующим образом 1978-06-17 23:00:00 +0000, связано с тем, что описание NSDate возвращает дату в GMT. 17 июня 1978 года в 23:00 - 18 июня 1978 года в 00:00 по Гринвичу + 1.

...