是否有ISO8601时间戳转换为格式化的NSDate一个简单的方法?是否有ISO8601时间戳转换为

2019-05-09 01:18发布

如果我使用下面的代码:

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?