NSDate и разные часовые пояса? - PullRequest
1 голос
/ 17 июня 2011

Хорошо. Наше приложение отправляет NSString из имени пользователя текущего пользователя и текущей даты в формате yyyyMMddHH. Наш сервер, который находится в Швеции, делает то же самое String и сравнивает их, когда получает вызов.

Теперь. Мы поняли, что если один из наших пользователей уедет за границу, часовой пояс изменится, что приведет к осложнениям.

если бы пользователь iPhone находился, скажем, в Сеуле, Южная Корея. Его NSString, который будет отправлен, будет выглядеть примерно так:

2011061718

Между тем, когда наш сервер получает вызов, он воссоздает свою собственную строку даты в этом формате, потому что он находится в Швеции.

2011061711

И, следовательно, запретить пользователю доступ к функциям на стороне сервера.

Подведем итог:

Как программно установить статический часовой пояс по умолчанию в моем приложении?

Атм мы делаем это:

NSDate *aDate = [aDateFormatter stringFromDate:[NSDate date]]; 

И как-то нам нужен часовой пояс, сравним разницу между фактическим часовым поясом пользователя и изменим его на шведский часовой пояс.

Есть идеи?

РЕДАКТИРОВАТЬ: ОК. Это приложение предназначено только для выпуска в Швеции. И мы используем комбинацию имени пользователя и текущей даты в формате yyyyMMddHH для создания безопасного ключа, ключ должен обновляться каждый раз, когда начинается новый час. Сервер, который находится в Швеции в часовом поясе GMT ​​+ 1, проверяет, что пользователь использует реальное устройство с помощью приложения, а не тот, кто сам сделал клиент, совершая мыльные звонки на наш сервис.

Поэтому, если один из наших пользователей выйдет за пределы часового пояса, он отклонит пользователя, поскольку строки не совпадают.

Вот почему мы хотим всегда устанавливать часовой пояс по умолчанию для этой функции GMT + 1. И это то, что мы действительно ищем.

Спасибо. Опять же.

Ответы [ 4 ]

5 голосов
/ 17 июня 2011

Если вам нужно настроить клиент для форматирования даты, вот как это сделать:

NSDate *now = [NSDate date];

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Europe/Stockholm"]; // Sets the right time.
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // Forces the date formatter to accept any format string.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:gregorianCalendar];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"yyyyMMddHH"];
[formatter setLocale:locale];

NSString *dateString = [formatter stringFromDate:now];

NSLog(@"Date: %@", dateString);

[locale release];
[gregorianCalendar release];
[formatter release];

Форматер даты сделает всю работу за вас, вам просто нужно настроить его.

Установив григорианский календарь, вы используете тот же календарь, что и в Швеции.

Установив часовой пояс, вы получите время, которое будет в Швеции.

Установив для языкового стандарта "en_US_POSIX", вы заставляете средство форматирования использовать именно тот формат, который вы указали, и не добавляете какие-либо AM / PM вещи.

2 голосов
/ 17 июня 2011

Не связывайтесь с этим. Отправьте полное время даты в виде строки и позвольте серверу вычислить время.

NSString *dtString = [[NSDate date] description];

Это создаст строку в формате

YYYY-MM-DD HH:MM:SS ±HHMM
0 голосов
/ 17 июня 2011

Кроме того, если вы включите функцию AM / PM на устройстве форматирования даты, будет выведено «AM / PM», даже если вы не поместите его в строку формата. Чтобы исправить это, также добавьте NSLocale в DateFormatter.

0 голосов
/ 17 июня 2011

Используйте -[NSDateFormatter setTimeZone:].NSDate не имеет к этому никакого отношения, поскольку он не заботится о часовых поясах.

Кстати, ваш код также потерпит неудачу, если пользователь использует другой календарь.

...