如果我使用下面的代码:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);
它成功地转换为一个Date
对象,但是,我似乎无法对其进行格式化任何其他方式比yyyy-MM-dd'T'HH:mm
,即记录的内容是2010-01-28T15:22:23
如果我改变的DateFormat说[dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"];
Date对象为空...
所以我最终的问题是如何从一个SQL数据库使用格式化ISO8601时间戳,例如, NSDateFormatterMediumStyle
返回“2010年1月,”?
Answer 1:
你需要另一个格式化处理的输出。 将这个代码后:
NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);
Answer 2:
我有一个类似但稍微复杂的问题,我已经找到了一个非常简单的解决方案!
问题:我的传入ISO8601日期如下所示: 2006-06-14T11:06:00+02:00
他们有一个时区的端部污损。
解决办法:用彼得Hosey的ISO8601DateFormatter,你可以下载在这里 。
ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;
和
ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;
Answer 3:
下面是从苹果的示例代码
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
NSDate *date = [formatter dateFromString:dateString];
链接: https://developer.apple.com/library/ios/#qa/qa1480/_index.html
Answer 4:
只要一提的是,因为iOS的6.0你可以使用这种格式:
yyyy-MM-dd'T'HH:mm:ssZZZZZ
Answer 5:
我有一个非常快的C实现在解析ISO8601 NSString的到NSDates的SAMCategories 。 你可以用的CocoaPods安装它,或只是将文件复制到您的项目。
以下是如何使用它:
[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]
这是非常强大的,支持缺失时区等就像我上面的评论说,NSDateFormatter解析大量日期时,对我来说非常缓慢。 切换到该实施帮助的巨大数额。
此代码是在6个生产应用程序(包括Hipstamatic和使用鲁恩 ,我已经没有已知的问题上工作)。 有一个测试套件 ,以防止回归。
总之,我认为这是解析在Objective-C ISO8601字符串的最佳途径。
一个简短的一边,如果你关心性能和传输,发送整数代替ISO8601串大大首选。 你可以简单地将它们转换成与日期[NSDate dateWithTimeIntervalSince1970:yourInteger]
性能是一样快,你可以把它和有更少的字符超过电汇。
Answer 6:
我要指出,我最后一次检查苹果NSDate
方法不支持ISO8601。 我仍然有关于苹果投入官方支持的一个错误。
+ (id)dateWithNaturalLanguageString:(NSString *)string
将正常(我最后一次跑了)解析和创建一个NSDate
从ISO801字符串对象,虽然文件说,你不应该使用它,它在所有ISO8601日期到目前为止,我已经试过工作。
Answer 7:
@danielbeard答案为我工作。 不过,还需要包括时区,否则一个UTC日期转换为当前的时区是不是你想要的。
- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
NSDateFormatter * dateFormatter = [NSDateFormatter new];
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
NSDate * date = [dateFormatter dateFromString:dateString];
return date;
}
Answer 8:
@Thread队长试试这个格式: “YYYY-MM-dd'T'HH:MM:SS.SSS”
文章来源: Is there a simple way of converting an ISO8601 timestamp to a formatted NSDate?