2013-10-25 26 views
0

我有一些簡單的代碼應該轉換我從CoreData中檢索到的NSDate。由於某些原因,當相同的代碼在其他視圖中工作時,它不適用於此類。我究竟做錯了什麼?下面是有問題的代碼和我的日誌的屏幕截圖...stringFromDate沒有將NSDate轉換爲字符串

NSFetchRequest *request26 = [[NSFetchRequest alloc] init]; 
[request26 setEntity:entityDiscription]; 
[request26 setResultType:NSDictionaryResultType]; 
NSExpression *keyPathExpression26 = [NSExpression expressionForKeyPath:@"date"]; 
NSExpression *swimLast750Expression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyPathExpression26]]; 
NSExpressionDescription *expressionDescription26 = [[NSExpressionDescription alloc] init]; 
[expressionDescription26 setName:@"swimLast750"]; 
[expressionDescription26 setExpression:swimLast750Expression]; 
[expressionDescription26 setExpressionResultType:NSInteger16AttributeType]; 
[request26 setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription26]]; 
NSPredicate *pred26 = [NSPredicate predicateWithFormat:@"(date >= %@) AND (sport like %@) AND (sessiontype like %@)", swimSinceDateAsDate, sportTypeSwim, sessType1]; 
[request26 setPredicate:pred26]; 

NSError *error26; 
NSArray *objects26 = [context executeFetchRequest:request26 error:&error26]; 
if (objects26 == nil) { 
    NSLog(@"The fetch request returned an array == nil"); 
} else { 
    NSLog(@"Contents of Array Object26 is:%@", objects26); 
    NSDate *sessDate = [[objects26 objectAtIndex:0] valueForKey:@"swimLast750"]; 
    NSLog(@"NSDate is: %@", sessDate); 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"dd-MMM-yyyy"]; 
    NSLog(@"DATE FORMATTER: %@", [formatter stringFromDate:[[objects26 objectAtIndex:0] valueForKey:@"swimLast750"]]); 
    NSString *dateString = [formatter stringFromDate:sessDate]; 
    //NSString *dateString = [formatter stringFromDate:[[objects26 objectAtIndex:0] valueForKey:@"swimLast750"]]; 
    NSLog(@"dateString is: %@", dateString); 
    sw750Last = dateString; 
} 

NSLog Output

+5

'sessDate'不是'NSDate'。看起來這可能是一個時間戳 - 從某個參考時間偏移幾秒鐘;可以存儲爲'NSNumber'或'NSString'。 –

回答

4

您已設置

[expressionDescription26 setExpressionResultType:NSInteger16AttributeType]; 

這導致獲取請求返回日期爲NSNumber。 這個數字是幾秒鐘,因爲「基準日」,2001年1月1日,格林尼治標準時間)的數量, 所以你可以將其轉換成NSDate

NSNumber *sessDateAsNumber = [[objects26 objectAtIndex:0] valueForKey:@"swimLast750"]; 
NSDate *sessDate = [NSDate dateWithTimeIntervalSinceReferenceDate:[sessDateAsNumber doubleValue]]; 

但更好的解決辦法可能是使用

[expressionDescription26 setExpressionResultType:NSDateAttributeType]; 

中的表達式描述。 然後返回日期爲NSDate對象,並且stringFromDate按預期工作。

+0

你絕對釘了它。我多次查看該代碼,甚至沒有記下attributeType - 這讓我很煩惱。感謝所有現在我已將它更改爲NSDateAttributeType的完美響應!天才! – Sean

1

你必須使用下面的code.I認爲你會得到它的NSNumber,所以你的時間戳轉換成日期必須把它轉換成一個雙值之前

NSTimeInterval interval = [sessDate doubleValue]; 
NSDate *swimLast750=[NSDate dateWithTimeIntervalSince1970:interval]; 
+0

這假定時間戳是相對於Unix紀元的。 –

+0

這實際上不起作用。日期存儲爲NSDate,但是我從coredata中將其作爲數字進行檢索,所以當我從1970年以來的一個時間間隔轉換時,如您所建議的,我得到的日期爲1984年10月5日,而不是2013年10月5日。感謝您的建議... – Sean

0

首先需要將時間間隔更改爲日期,然後設置指定的格式。嘗試以下代碼: -

NSDate *date=[NSDate dateWithTimeIntervalSinceReferenceDate:402663864]; 
NSDateFormatter *formatter=[[NSDateFormatter alloc]init]; 
[formatter setDateFormat:@"yyyy-MM-dd"]; 
NSLog(@"%@",date); 
NSString *dateString=[formatter stringFromDate:date]; 
NSLog(@"dateString=%@",dateString);