0

ゲームで毎日コインを与えるために、「毎日の報酬」メソッドを実装していました。

実際の日付と時刻を含む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

そのため、アプリを開いてこのメソッドを呼び出すと、何らかの理由でアプリがクラッシュします。

問題は、2 つの日付の比較にあるのではないかと思います。

何か問題があるかどうか誰かに教えてもらえますか?

4

4 に答える 4

3

NSDate には、日付を比較するためのメソッドがあります。どうぞ:

isEqualToDate: 指定されたオブジェクトが NSDate オブジェクトであり、レシーバーと正確に等しいかどうかを示すブール値を返します。

- (BOOL)isEqualToDate:(NSDate *)anotherDate

laterDate: 受信者と別の指定された日付のどちらか遅い方を返します。

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

EarlyDate: 受信者と別の指定された日付の早い方を返します。

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

于 2013-06-25T12:14:22.137 に答える
3

以下を使用します。

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

date1 と date2 はNSdateオブジェクトです。

于 2013-06-25T12:10:26.480 に答える
1

このようにしてみてください。それはあなたを助けるかもしれません

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");
于 2013-06-25T12:49:28.810 に答える