dateFromString always returns null with dateformatter

19,497

Solution 1

Are you doing this in a background thread? I had weird experiences with NSDateFormatter when not being used in the ui-thread. Anyway, here's the method I use, should work for you:

+ (NSDate*)parseDate:(NSString*)inStrDate format:(NSString*)inFormat {
    NSDateFormatter* dtFormatter = [[NSDateFormatter alloc] init];
    [dtFormatter setLocale:[NSLocale systemLocale]];
    [dtFormatter setDateFormat:inFormat];
    NSDate* dateOutput = [dtFormatter dateFromString:inStrDate];
    [dtFormatter release];
    return dateOutput;
}

Solution 2

If the device is set to AM/PM time and requested string format is set to @"yyyy-MM-dd HH:mm:ss" dateFromString will return nil.

If you set the locale to @"en_US" conversion will return correct date.

dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [dateFormat dateFromString:@"2013-02-14 09:30:00"];

Solution 3

I had the same issue. I started by double-checking that the string used for conversion was valid by using this resource.

I then had a thought that it might be the locale, so I tried the following:

[dateFomatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]]

It worked like a charm. Hope this helps.

Solution 4

I just ran this code and it worked for me.

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setFormatterBehavior:NSDateFormatterBehaviorDefault];

NSDate *theDate = [df dateFromString:@"2011-04-12 10:00:00"];
NSLog(@"date: %@", theDate);

The output was: date: 2011-04-12 17:00:00 +0000

Solution 5

Yes, agreed with @Jan Gressmann, this is so wierd! I am using the NSDateFormatter on non-ui thread as well, and dateFromString selector returns null sometimes... For example, I have this code:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormat setLocale:usLocale];
[dateFormat setDateFormat:@"dd MMM yy HH:mm:ss"];
NSDate *startDate = [dateFormat dateFromString:str_StartDate];
NSDate *endDate = [dateFormat dateFromString:str_endDate];

Output in console:

(lldb) po str_StartDate
(NSString *) $7 = 0x06da2180 03 SEP 2012 10:00:00
(lldb) po str_endDate
(NSString *) $8 = 0x06d3a810 08 SEP 2013 10:00:00
(lldb) po startDate
(NSDate *) $9 = 0x00000000 <nil>
(lldb) po endDate
(NSDate *) $10 = 0x06db05b0 2013-09-08 02:00:00 +0000

This is really wierd...

Share:
19,497

Related videos on Youtube

aherlambang
Author by

aherlambang

iOS and web developer passionate on building apps

Updated on December 15, 2020

Comments

  • aherlambang
    aherlambang over 3 years

    I have the following code:

     NSDateFormatter * df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        [df setTimeZone:[NSTimeZone systemTimeZone]];
        [df setFormatterBehavior:NSDateFormatterBehaviorDefault];
    
        [df dateFromString:@"2011-04-12 10:00:00"];
    

    In which it always generates a null date. Why is this?

    • XJones
      XJones about 13 years
      Looks like the same question you asked yesterday but simplified. You should modify the original question. Some of us spent a lot of time trying to help you. stackoverflow.com/questions/5628062/…
  • NWCoder
    NWCoder about 13 years
    Did you forget the: NSDate *theDate =
  • Jasper
    Jasper about 10 years
    Even doing a check and setting the format to "hh:mm a" does not work. This does. Thanks!
  • Vladimir
    Vladimir almost 9 years
    Settings time zone with abbreviation "UTC" helped me. Thx

Related