NSDateFormatter不格式化字符串

时间:2013-05-01 20:25:58

标签: ios nsdateformatter

我有以下代码,正在为UITableView的cellForRowAtIndexPath调用。

self.dateFormatter = [[NSDateFormatter alloc] init];
[self.dateFormatter setDateFormat:@"EEEE, dd MMM yyyy HH:mm:ss z"];

OLVisit *visit = [self.visits objectAtIndex:indexPath.row];
NSString *strVisitDate = [NSString stringWithFormat:@"%@", visit.olcreatedat];
NSDate *visitDate = [self.dateFormatter dateFromString:strVisitDate];
strVisitDate = [self.dateFormatter stringFromDate:visitDate];

visit.olcreatedat返回的字符串格式如下(可在下面的调试器截图中看到)“2013-04-09 11:55:25 +0000”。

enter image description here

我将一个nil NSDate值返回到visitDate。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

更新:正如@rmaddy指出的那样,对于visit.olcreatedat是什么存在误解。 第一个答案基于visit.olcreatedat是一个假设 NSDate的。对于假设visit.olcreatedat是包含格式化日期的NSString的答案,请阅读此答案的第二部分。

visit.olcreatedat是一个NSDate

- (void)viewDidLoad {
    [super viewDidLoad];

    // Alloc the date formatter in a method that gets run only when the controller appears, and not during scroll operations or UI updates.
    self.outputDateFormatter = [[NSDateFormatter alloc] init];
    [self.outputDateFormatter setDateFormat:@"EEEE, dd MMM yyyy HH:mm:ss z"];
}


- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath: {
   // dequeue or create the cell... 
   // ...
   // ...

   OLVisit *visit = [self.visits objectAtIndex:indexPath.row];
   NSString * strVisitDate = [self.outputDateFormatter stringFromDate:visit.olcreatedat];

   // Here you can assign the string to the right UILabel
   cell.textLabel.text = strVisitDate;

   return cell;
}

visit.olcreatedat是一个NSString

是否要将visit.olcreatedat转换为格式 EEEE,dd MMM yyyy HH:mm:ss z ?如果是这样,让我们​​完成每一步。

首先,您需要将visit.olcreatedat字符串(存储在strVisitDate中)转换为实际的NSDate对象visitDate。因此,要使此步骤有效,您需要一个接受visit.olcreatedat格式的NSDateFormatter: yyyy-MM-dd HH:mm:ss z

然后,您希望将获得的visitDate NSDate转换为您喜欢的格式,因此您需要另一个NSDateFormatter,格式为 EEEE,dd MMM yyyy HH:mm:ss z

- (void)viewDidLoad {
    [super viewDidLoad];

    // Alloc the date formatter in a method that gets run only when the controller appears, and not during scroll operations or UI updates.
    self.inputDateFormatter = [[NSDateFormatter alloc] init];
    [self.inputDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];
    self.outputDateFormatter = [[NSDateFormatter alloc] init];
    [self.outputDateFormatter setDateFormat:@"EEEE, dd MMM yyyy HH:mm:ss z"];
}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath: {
   // dequeue or create the cell... 
   // ...
   // ...

   OLVisit *visit = [self.visits objectAtIndex:indexPath.row];
   NSString *strVisitDate = visit.olcreatedat;
   NSDate *visitDate = [self.inputDateFormatter dateFromString:strVisitDate];
   strVisitDate = [self.outputDateFormatter stringFromDate:visitDate];

   // Here you can assign the string to the right UILabel
   cell.textLabel.text = strVisitDate;

   return cell;
}

答案 1 :(得分:1)

更改日期格式并替换代码:

旧:

[self.dateFormatter setDateFormat:@"EEEE, dd MMM yyyy HH:mm:ss z"];

新:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];

这是因为您使用的是不同的日期格式,而strVisitDate日期格式为“yyyy-MM-dd HH:mm:ss z”。 所以你需要设置相同的格式。

编辑:

用此替换您的代码。

self.dateFormatter = [[NSDateFormatter alloc] init];
[self.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];

OLVisit *visit = [self.visits objectAtIndex:indexPath.row];
NSString *strVisitDate = [NSString stringWithFormat:@"%@", visit.olcreatedat];

NSDate *visitDate = [dateFormatter dateFromString:strVisitDate];
strVisitDate = [dateFormatter stringFromDate:visitDate];

//Here you can set any date Format as per your need

[dateFormatter setDateFormat:@"EEEE, dd MMM yyyy HH:mm:ss z"];
strVisitDate = [dateFormatter stringFromDate:visitDate];

希望它对你有所帮助。