带有CST的iOS dateFromString在设备上不起作用

时间:2014-02-27 09:42:16

标签: ios objective-c cocoa-touch

我需要将NSString @"2014-02-26 16:56:03 -06:00 CST"转换为NSDate。试过"yyyy-MM-dd HH:mm:ss zzz zzz"没有运气。我认为问题出在zzz zzz部分。

这是我的代码:

NSString *string = @"2014-02-26 16:56:03 -06:00 CST";
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"yyyy-MM-dd HH:mm:ss zzz zzz";
NSDate *date = [df dateFromString: string];

仅在使用设备时日期为零。在模拟器上一切正常。

2 个答案:

答案 0 :(得分:1)

我设法在设备上获得了正确的日期值,但我不得不做出解决方法。 基本上,如果时区缩写(例如"CST")在字符串中,则日期格式化程序无法解析日期。我查看了Apple's个文档并查看了Unicode Technical Standard #35。但是我找不到一种可行的模式。

解决方法是删除时区缩写。然后一切都按预期工作。

NSString *string = @"2014-02-26 16:56:03 -06:00 CST";
NSMutableArray *components = [[string componentsSeparatedByString:@" "] mutableCopy];

// Remove the time zone abbreviation.
[components removeLastObject];
string = [components componentsJoinedByString:@" "];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss ZZZZ";

NSDate *date = [dateFormatter dateFromString: string];

NSLog(@"Date: %@", date);

答案 1 :(得分:0)

我认为这会对你有所帮助,如果NSString @"2014-02-26 16:56:03 -06:00 CST"格式得到修复,无论是否是其他人的CST,都可以。

    NSString *inDateStr = @"2014-02-26 16:56:03 -06:00 CST";
    NSString *dateStr = [dateStr substringToIndex:26]; // 2014-02-26 16:56:03 -06:00
    NSString *zoneStr =[dateStr substringFromIndex:27]; // CST
    NSDateFormatter*dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone timeZoneWithName:zoneStr]];
    [dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"];
    NSDate *outDate = [dateFormat dateFromString: dateStr];