格式化日期时出错

时间:2014-01-23 04:48:32

标签: ios crash nsdate nsdatecomponents

我正在使用代码更改日期格式:

NSDateFormatter *dateFormat=[NSDateFormatter new];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];


    dateFormat.locale=locale;

   [dateFormat setDateFormat:@" dMMyyyy HH:mm:ss"];
   NSDate *date = [dateFormat dateFromString:Currentdate];
  NSDate *today = [dateFormat dateFromString:[datef stringFromDate:[NSDate date]]];
    NSLog(@"date %@ %@",date,Currentdate);

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSUInteger unitFlags =   NSHourCalendarUnit|NSMinuteCalendarUnit
     ;
    NSDateComponents *components = [gregorian components:unitFlags
                                                fromDate:date
                                                  toDate:today options:0];

但是我得到了错误:

  *** -[__NSCFCalendar components:fromDate:]: date cannot be nil
 I mean really, what do you think that operation is supposed to mean with a nil date?
 An exception has been avoided for now.
 A few of these errors are going to be reported with this complaint, then further.    violations will simply silently do whatever random thing results from the nil.
Here is the backtrace where this occurred this time (some frames may be missing due to       compiler optimizations):
    (
0   CoreFoundation                      0x30ffbad5 <redacted> + 92
1   CoreFoundation                      0x30ffba63 <redacted> + 74
2   VoxSci                              0x000d6997 -[MessagesViewController DayCounting] + 602
3   VoxSci                              0x000d858d -[MessagesViewController tableView:cellForRowAtIndexPath:] + 4000
4   UIKit                               0x33930315 <redacted> + 408
5   UIKit                               0x338d86cd <redacted> + 1800
6   UIKit                               0x338d7ef1 <redacted> + 184
7   UIKit                               0x337fe353 <redacted> + 346
8   QuartzCore                          0x33484943 <redacted> + 142
9   QuartzCore                          0x33480167 <redacted> + 350
10  QuartzCore                          0x3347fff9 <redacted> + 16
11  QuartzCore                          0x3347fa0d <redacted> + 228
12  QuartzCore                          0x3347f81f <redacted> + 314
13  QuartzCore                          0x3347954d <redacted> + 56
14  CoreFoundation                      0x31044f69 <redacted> + 20
15  CoreFoundation                      0x310428f7 <redacted> + 286
16  CoreFoundation                      0x31042c43 <redacted> + 738
17  CoreFoundation                      0x30fad471 CFRunLoopRunSpecific + 524
18  CoreFoundation                      0x30fad253 CFRunLoopRunInMode + 106
19  GraphicsServices                    0x35ce72eb GSEventRunModal + 138
20  UIKit                               0x33862845 UIApplicationMain + 1136

22  libdyld.dylib                       0x3b8cfab7 <redacted> + 2

我搜索了它但得到了类似的东西。有人告诉我问题或我错了。 任何帮助将不胜感激。提前谢谢。

5 个答案:

答案 0 :(得分:1)

我觉得你有一个错字:) 试试

  

[dateFormat setDateFormat:@“ddMMyyyy HH:mm:ss”];

答案 1 :(得分:1)

你的代码应该是

NSString *Currentdate = @"2013-08-06 03:51:54";

NSDateFormatter *dformat = [[NSDateFormatter alloc]init];

[dformat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *date = [dformat dateFromString:datestr];

参考Apple的文档NSDateFormatter Class Reference

答案 2 :(得分:0)

您的Currentdate变量将为nil

您的dateFormat错误[dateFormat setDateFormat:@" dMMyyyy HH:mm:ss"];

答案 3 :(得分:0)

使用以下代码可能会对您有帮助。

 NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"HH:mm dd MMM yyyy" options:0
                                                              locale:[NSLocale currentLocale]];
date = [fmt dateFromString:[NSString stringWithFormat:@"%@ %@", obj.meetingTime, obj.meetingDate]];

有关详细说明,请参阅以下链接。

What kind of sarcastic error is this iOS?

答案 4 :(得分:0)

首先,我认为你的意思是ddMMyyyy HH:mm:ss    [dateFormat setDateFormat:@“dMMyyyy HH:mm:ss”];

其次,它取决于您Currentdate的设置。它必须与您的NSDateForatter匹配,否则将无法正常工作。例如

NSString *Currentdate = @"2014-01-01 01:00:00";
NSString *Currentdate2 = @"01012014 01:00:00";

NSDateFormatter *dateFormat=[NSDateFormatter new];
[dateFormat setDateFormat:@"ddMMyyyy HH:mm:ss"];
NSDate *date = [dateFormat dateFromString:Currentdate];
NSLog(@"Currentdate %@",date);

将记录以下

2014-01-22 23:14:27.958 TableViewCellWithAutoLayout[94829:a0b] Currentdate (null)
2014-01-22 23:14:27.959 TableViewCellWithAutoLayout[94829:a0b] Currentdate2 = 2014-01-01 07:00:00 +0000

为什么第一个日期为null,第二个日期有效?这是因为格式在第二个日期是正确的,但在第一个日期中格式不正确(对于此NSDateFormatter)。

也是这一行

NSDate *today = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]];

与此行相同

NSDate *today = [NSDate date];

您只是从NSDate转换为字符串转换为NSDate。

要从@"Thur, 2 Jan 2014 19:40:18 GMT"格式转换日期,我将从字符串中删除GTMThur,并使用格式d MMM yyyy HH:mm:ss

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm:ss"];
NSString *dateString = @"Thur, 2 Jan 2014 19:40:18 GMT";
dateString = [dateString stringByReplacingOccurrencesOfString:@"GMT" withString:@""];

NSRange range = [dateString rangeOfString:@", " options:NSBackwardsSearch range:NSMakeRange(0, [dateString length]-1)];
NSLog(@"range.location: %lu", range.location);
dateString = [dateString substringFromIndex:range.location+1];

NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(@"date = %@",date);