Ограничить действие один раз в день - PullRequest
0 голосов
/ 03 февраля 2012

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

Как мне убедиться, что сохраненная NSDate не соответствует текущему дню? Могу ли я сравнить дневное значение двух NSDate, игнорируя время?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Даты - это просто обертки вокруг NSTimeIntervals.Они не имеют понятия о местном времени, поэтому вы не можете получить значение дня непосредственно из них.

Вы можете использовать NSDateFormatter, например так:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/MM/dd"];

NSString *today = [formatter stringFromDate:[NSDate date]];

NSString *dateToCompare = [formatter stringFromDate:someDate];

if ([dateToCompare isEqualToString:today])
{
    ...
}

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

Если вы действительно хотите убедиться, что события разнесены более чем на 24 часа (чтобы предотвратить мошенничество), это намного проще, простосделайте это:

if ([date1 timeIntervalSinceDate:date2] > 3600*24)
{
    ...
}

ОБНОВЛЕНИЕ: Как отмечает abbood в комментариях, создание объектов NSDateFormatter может быть дорогим / медленным, поэтому вы должны держаться за них, если они будут использоваться повторно.1012 * Не рекомендуется хранить их в статической переменной или синглтоне, потому что они не являются поточно-ориентированными, но вы можете сохранить их в threadDictionary текущего потока, например:

//check for a cached formatter and recreate if needed
NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSDateFormatter *formatter = threadDict[@"someUniqueKey"];
if (!formatter)
{
    //create the formatter
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy/MM/dd"];

    //cache the formatter
    threadDict[@"someUniqueKey"] = formatter;
}

//use the formatter
...
1 голос
/ 03 февраля 2012

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

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
NSInteger weekday = [comps weekday];

В качестве альтернативы вы можете использовать метод components:fromDate:toDate:options: для проверки количества дней в интервале времени между двумя датами вместо текущего дня в календаре. Это может быть более полезно, если вы хотите разрешать ответ каждые 24 часа вместо дня недели.

Конечно, если для онлайн-игры (или чего-либо подобного) вы хотите проверить любые ответы на сервере, а также на клиенте, пользователь может легко изменить дату или часовой пояс на "обман".

...