iPhone上的格式化日期返回(null)

时间:2012-04-29 10:49:40

标签: iphone date nsdateformatter

我的日期格式为: 7月16日星期五16:58:46 +0000 2010 。 要将其转换为 2010年7月16日星期五,我试过:

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

for(int i=0; i<[self.data count]; i++) {
    id celldata = [self.data objectAtIndex:i];
    NSString *str = [NSString stringWithFormat:@"%@", [celldata objectForKey:@"created_at"]];
    NSLog(@"date for %u is %@",i, str); //this works and writes the date
    [df setDateFormat:@"eee MMM dd HH:mm:ss Z yyyy"];
    NSDate *date = [df dateFromString:str];
    [df setDateFormat:@"eee MMM dd yyyy"];
    NSString *dateStr = [df stringFromDate:date];
    NSLog(@"%@",dateStr);
}

但是 NSLog(@“%@”,dateStr)只写(null)。如何让它运作?

EDIT 无论出于何种原因,我通过改变

来实现它
  

[df setDateFormat:@“eee MMM dd HH:mm:ss Z yyyy”];

  

[df setDateFormat:@“MMM dd HH:mm:ss Z yyyy”];

并从我的字符串中删除工作日。不过,谢谢大家。

3 个答案:

答案 0 :(得分:0)

如果您解析为日期的原始字符串实际上是格式为“20081122”,那么第一次调用“setDateFormat”在两个片段中都是不正确的,因为指定的格式不正确。

假设[celldata objectForKey:@“created_at”]按照您的第二个代码片段以“20081122”的格式返回日期,您需要更改第一次调用setDateFormat以使用正确的字符串格式,“yyyyMMdd “当你调用方法”dateFromString“时,这将驱动正确的转换。然后,一旦你有一个NSDate *对象表示,你可以使用通过stringFromDate将它转换回字符串时所需的任何格式。

NSString *dateStr = @"20081122";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
//This is the important change here, this format MUST match the format of the string.
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *date = [dateFormat dateFromString:dateStr];  
[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
dateStr = [dateFormat stringFromDate:date];  
[dateFormat release];

答案 1 :(得分:0)

这可能对你有所帮助。我有一段时间遇到类似的问题,所以我创建了以下方法。


<强>解释

#define DATE_TYPE_hhmmss [NSArray arrayWithObjects:@"h", @"m", @"s", nil]
#define DATE_TYPE_MMDDYYYY [NSArray arrayWithObjects:@"M", @"D", @"Y", nil]
#define DATE_TYPE_MMDDYYYYhhmmss [NSArray arrayWithObjects:@"M", @"D", @"Y", @"h", @"m", @"s", nil]
#define DATE_TYPE_MMDDYYYYWWhhmmss [NSArray arrayWithObjects:@"M", @"D", @"Y", @"W", @"h", @"m", @"s", nil]
#define DATE_TYPE_MMDDYYYYhhmmssWW [NSArray arrayWithObjects:@"M", @"D", @"Y", @"h", @"m", @"s", @"W", nil]
#define DATE_TYPE_YYYYMMDD [NSArray arrayWithObjects:@"Y", @"M", @"D", nil]
#define DATE_TYPE_YYYYMMDDhhmmss [NSArray arrayWithObjects:@"Y", @"M", @"D", @"h", @"m", @"s", nil]
#define DATE_TYPE_YYYYMMDDWWhhmmss [NSArray arrayWithObjects:@"Y", @"M", @"D", @"W", @"h", @"m", @"s", nil]
#define DATE_TYPE_YYYYMMDDhhmmssWW [NSArray arrayWithObjects:@"Y", @"M", @"D", @"h", @"m", @"s", @"W", nil]
#define DATE_TYPE_FRIENDLY [NSArray arrayWithObjects:@"xx", nil]

日期方法

从值创建日期

-(NSDate *) getDateWithMonth:(int)month day:(int)day year:(int)year {
    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    NSDateComponents * dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];

    [dateFormatter setDateFormat:@"MM"];
    [dateComponents setMonth:month];
    [dateFormatter setDateFormat:@"DD"];
    [dateComponents setDay:day];
    [dateFormatter setDateFormat:@"YYYY"];
    [dateComponents setYear:year];

    NSDate * result = [calendar dateFromComponents:dateComponents];

    return result;
}

-(NSDate *) getDateWithMonth:(int)month day:(int)day year:(int)year hour:(int)hour minute:(int)minute {
    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    NSDateComponents * dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]];

    [dateFormatter setDateFormat:@"MM"];
    [dateComponents setMonth:month];
    [dateFormatter setDateFormat:@"DD"];
    [dateComponents setDay:day];
    [dateFormatter setDateFormat:@"YYYY"];
    [dateComponents setYear:year];
    [dateFormatter setDateFormat:@"HH"];
    [dateComponents setHour:hour];
    [dateFormatter setDateFormat:@"MM"];
    [dateComponents setMinute:minute];

    NSDate * result = [calendar dateFromComponents:dateComponents];

    return result;
}

-(NSDate *) getDateWithMonth:(int)month day:(int)day year:(int)year hour:(int)hour minute:(int)minute second:(int)second {
    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    NSDateComponents * dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:[NSDate date]];

    [dateFormatter setDateFormat:@"MM"];
    [dateComponents setMonth:month];
    [dateFormatter setDateFormat:@"DD"];
    [dateComponents setDay:day];
    [dateFormatter setDateFormat:@"YYYY"];
    [dateComponents setYear:year];
    [dateFormatter setDateFormat:@"HH"];
    [dateComponents setHour:hour];
    [dateFormatter setDateFormat:@"MM"];
    [dateComponents setMinute:minute];
    [dateFormatter setDateFormat:@"SS"];
    [dateComponents setSecond:second];

    NSDate * result = [calendar dateFromComponents:dateComponents];

    return result;
}

从日期获取字符串

-(NSString *) getStringFromDate:(NSDate *)date dateType:(NSArray *)dateType {
    NSString * result = @"";

    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSString * format = @"";

    NSDateComponents * dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];

    NSInteger year = [dateComponents year];
    NSInteger month = [dateComponents month];
    NSInteger day = [dateComponents day];
    NSInteger weekday = [dateComponents weekday];
    NSInteger hour = [dateComponents hour];
    NSInteger minute = [dateComponents minute];
    NSInteger second = [dateComponents second];

    if (dateType != nil) {
        for (int x = 0; x < [dateType count]; x++) {
            if (x == ([dateType count]-1)) {
                if ([[dateType objectAtIndex:x] isEqualToString:@"Y"]) {
                    format = [format stringByAppendingFormat:@"%d", year];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"M"]) {
                    format = [format stringByAppendingFormat:@"%d", month];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"D"]) {
                    format = [format stringByAppendingFormat:@"%d", day];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"W"]) {
                    format = [format stringByAppendingFormat:@"%d", weekday];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"h"]) {
                    format = [format stringByAppendingFormat:@"%d", hour];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"m"]) {
                    format = [format stringByAppendingFormat:@"%d", minute];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"s"]) {
                    format = [format stringByAppendingFormat:@"%d", second];
                }
            } else {
                if ([[dateType objectAtIndex:x] isEqualToString:@"Y"]) {
                    format = [format stringByAppendingFormat:@"%d|", year];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"M"]) {
                    format = [format stringByAppendingFormat:@"%d|", month];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"D"]) {
                    format = [format stringByAppendingFormat:@"%d|", day];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"W"]) {
                    format = [format stringByAppendingFormat:@"%d|", weekday];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"h"]) {
                    format = [format stringByAppendingFormat:@"%d|", hour];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"m"]) {
                    format = [format stringByAppendingFormat:@"%d|", minute];
                } else if ([[dateType objectAtIndex:x] isEqualToString:@"s"]) {
                    format = [format stringByAppendingFormat:@"%d|", second];
                }
            }

            if ([[dateType objectAtIndex:x] isEqualToString:@"xx"]) {
                format = [NSString stringWithFormat:@"Year: %d, Month: %d, Day: %d, Weekday: %d, Hour: %d, Minute: %d, Second: %d", year, month, day, weekday, hour, minute, second];
            }
        }
    } else {
        format = [format stringByAppendingFormat:@"%d|", year];
        format = [format stringByAppendingFormat:@"%d|", month];
        format = [format stringByAppendingFormat:@"%d|", day];
        format = [format stringByAppendingFormat:@"%d|", weekday];
        format = [format stringByAppendingFormat:@"%d|", hour];
        format = [format stringByAppendingFormat:@"%d|", minute];
        format = [format stringByAppendingFormat:@"%d|", second];

        format = [NSString stringWithFormat:@"%d|%d|%d|%d|%d|%d|%d", year, month, day, weekday, hour, minute, second];
    }

    result = format;

    return result;
}

示例

NSDate * date = [self getDateWithMonth:12 day:24 year:1994];
NSString * dateInString = [self getStringFromDate:date dateType:DATE_TYPE_MMDDYYYY];

int month = [[[dateInString componentsSeparatedByString:@"|"] objectAtIndex:0] intValue];
int day = [[[dateInString componentsSeparatedByString:@"|"] objectAtIndex:1] intValue];
int year = [[[dateInString componentsSeparatedByString:@"|"] objectAtIndex:2] intValue];

NSLog(@"String of Date: \"%@\"", dateInString);
NSLog(@"Month: %d", month);
NSLog(@"Day: %d", day);
NSLog(@"Year: %d", year);

方法[self getDateWithMonth:12 day:24 year:1994]返回一个通常难以阅读的NSDate对象,因此您可以使用[self getStringFromDate:date dateType:DATE_TYPE_MMDDYYYY]来获取NSDate对象的字符串。

使用定义(宏)指定您希望在字符串中获取的日期格式。

例如: DATE_TYPE_hhmmss会返回Hour|Minute|SecondDATE_TYPE_MMDDYYYY会返回Month|Day|YearDATE_TYPE_MMDDYYYYhhmmss会返回Month|Day|Year|Hour|Minute|SecondDATE_TYPE_MMDDYYYYWWhhmmss将返回Month|Day|Year|Weekday (#)|Hour|Minute|Second

依旧......

控制台日志

2012-04-29 13:42:15.791 Atomic Class[1373:f803] String of Date: "12|24|1994"
2012-04-29 13:42:15.793 Atomic Class[1373:f803] Month: 12
2012-04-29 13:42:15.794 Atomic Class[1373:f803] Day: 24
2012-04-29 13:42:15.794 Atomic Class[1373:f803] Year: 1994

答案 2 :(得分:0)

使用Dateformatter进行周EEE而不是eee

[df setDateFormat:@“EEE MMM dd HH:mm:ss Z yyyy”];

我希望这会对你有所帮助......