【问题标题】:Comparing two dates for daily reward in iOS game比较iOS游戏中每日奖励的两个日期
【发布时间】:2013-06-25 12:06:00
【问题描述】:

我正在实施“每日奖励”方法,以便每天在我的游戏中给予一些硬币。

我有一个包含实际日期和时间的 json。

问题是我不知道如何比较日期。

这是我的代码 -

@implementation ItemRewardManager

+(NSDate *)dateFromUTCTimeStamp:(NSString *)dateString{

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *myDate = [df dateFromString: dateString];
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [df setTimeZone:gmt];

    [[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"lastDatePlayed"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)getData
{
    NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:dateUrl]];
    id jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
    NSArray *keys = [jsonObjects allKeys];

    // values in foreach loop
    for (NSString *key in keys) {
        NSLog(@"%@ is %@",key, [jsonObjects objectForKey:key]);
    }
}

+(void)dailyReward{
    NSLog(@"llega al daily");
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"HH:mm:ss zzz"];

    NSDate *now = [NSDate date];
    NSString *dateString = [dateFormat stringFromDate:now];

    if([[[NSUserDefaults standardUserDefaults] objectForKey:@"lastDatePlayed"] isEqualToString: dateString])
    {
        NSLog(@"Actual date is the same as json date");
        UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:nil
                                                         message:@"You have win 5 coins! Come back tomorrow for more."
                                                        delegate:nil
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles: nil] autorelease];
        [alert show];
        return;
    }
}
@end

所以,当我打开我的应用并调用此方法时,我的应用由于某种原因崩溃了。

我认为问题可能出在两个日期的比较上。

如果有什么问题,谁能告诉我?

【问题讨论】:

  • 我不认为给予奖励是客户端的工作,而是服务器的工作。但是您是否已经调试过您的“lastDatePlayed”?您将其保存为 NSDate 对象并将其与 NSString 进行比较。可能是一个原因。顺便说一句,据我所知,这些结果永远不会相等:)
  • @geo 你是对的。我没有比较一些逻辑。我现在不知道每日奖励的逻辑......你能帮我吗?
  • 我建议让服务器计算奖励,只需向您发送通知,您现在可以请求它。我也会让服务器发送一个 unix-timestamp,更易于使用。也可以使用@torip3ng 的答案来比较日期。并将值添加到日期,您可以使用 NSDateComponentsNSCalendar。 (NSDateComponents *comps = [[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:date];) 即
  • @geo 我会尝试比较日期,因为另一个人给我做了一个带有日期的 json。所以我不能修改它。
  • 我不认为你应该比较两个日期——你应该根据他/她自己的优点来考虑每个日期。并且以某种方式“奖励”“更好”的日期似乎有些不合时宜。 (SO 什么时候变成了日期线?)

标签: iphone ios date nsdate


【解决方案1】:

使用以下。

if ([date1 compare:date2]==NSOrderedSame)

date1 和 date2 是 NSdate 对象。

【讨论】:

  • 我不明白,我应该将 'date1' 替换为 'dateString' 并将 'date2' 替换为 '[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"lastDatePlayed"];' 吗?跨度>
  • 不是字符串。你有 NSDate *now = [NSDate date];和 lastDate 对象。如果您将 lastDate 存储为字符串,请将其转换为 dateObject,例如 NSDate *now = [dateFormat dateFromString:[[NSUserDefaults standardUserDefaults] objectForKey:@"lastDatePlayed"]];
  • 不,崩溃。由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSDate 长度]:无法识别的选择器发送到实例 0x1d587e10”
【解决方案2】:

NSDate 有比较日期的方法。 他们在这里:

isEqualToDate:返回一个布尔值,指示是否给定 object 是一个 NSDate 对象,完全等于接收者。

- (BOOL)isEqualToDate:(NSDate *)anotherDate

laterDate:返回接收者和另一个给定日期中较晚的日期。

- (NSDate *)laterDate:(NSDate *)anotherDate

earlierDate:返回较早的接收者和另一个给定的 日期。

- (NSDate *)earlierDate:(NSDate *)anotherDate

【讨论】:

  • 喜欢这个? if ([now isEqualToDate:serverDate] == TRUE) { NSLog(@"实际日期与 json 日期相同"); UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:nil message:@"你赢了5个硬币!明天再来拿更多。" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil] autorelease]; [警报显示];返回; }
  • 比较和获取日期对象需要这些方法。简单比较:if ([date1 compare:date2] == NSOrderedDescending) { NSLog(@"date1 is later than date2"); } else if ([date1 compare:date2] == NSOrderedAscending) { NSLog(@"date1 早于 date2"); } else { NSLog(@"日期相同"); }
【解决方案3】:

试试这样。可能对你有帮助

NSDate *now = [NSDate date]; // current date
NSDate *newDate = [dateFormat dateFromString:[[NSUserDefaults standardUserDefaults] objectForKey:@"lastDatePlayed"]]; // server date 

NSComparisonResult result; 

result = [now compare:newDate]; // comparing two dates

if(result == NSOrderedAscending)
    NSLog(@"now is less");
else if(result == NSOrderedDescending)
    NSLog(@"newDate is less");
else
    NSLog(@"Both dates are same");

【讨论】:

  • 我应该在"xxxx" 上放什么?这个:[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"lastDatePlayed"]; ?
  • [[NSUserDefaults standardUserDefaults] objectForKey:@"lastDatePlayed"]。放这个试试
  • NSDate *newDate = [NSDate dateWithString:[[NSUserDefaults standardUserDefaults] objectForKey:@"lastDatePlayed"]]; 完整代码
  • 不是误会,是告诉我Class method +dateWithString: not found (return type defaults to id) 的警告,我认为是dateFromComponents: 或类似的东西
【解决方案4】:

使用此代码。

 NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
[dateFormatter1 setDateFormat:@"MM/dd/yyyy"];
NSDate *ServerDate = [dateFormatter1 dateFromString:@"03/01/2013"];
[dateFormatter1 release];
NSTimeInterval interval = [date timeIntervalSinceDate:ServerDate];
int diff=interval/1440;

这是实现的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2018-11-28
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多