无法使用NSDateFormatter格式化UTC日期

She*_*lam 18 iphone cocoa-touch objective-c nsdate nsdateformatter

我有以下日期:

2011-10-20T01:10:50Z
Run Code Online (Sandbox Code Playgroud)

我希望它被格式化为

"M/d/yy 'at' h:mma"
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    //The Z at the end of your string represents Zulu which is UTC
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    [dateFormatter setDateFormat:@"yyyy-dd-MM'T'HH:mm:ss'Z'"];
    NSDate* newTime = [dateFormatter dateFromString:[message valueForKey:@"created_at"]];

    //Add the following line to display the time in the local time zone
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"];
    NSString* finalTime = [dateFormatter stringFromDate:newTime];
    [dateFormatter release];
    NSLog(@"%@", finalTime);    
Run Code Online (Sandbox Code Playgroud)

不幸的是,finalTime在这里是NULL.

bry*_*mac 34

你有dd-MM倒退.你有10个dd和20个MM.没有20个月.

2011-10-20T01:10:50Z
@"yyyy-dd-MM'T'HH:mm:ss'Z'"
Run Code Online (Sandbox Code Playgroud)

因此,newTime为null,finalTime为null.

这是修复.这个:

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

//The Z at the end of your string represents Zulu which is UTC
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];

NSDate* newTime = [dateFormatter dateFromString:@"2011-10-20T01:10:50Z"];
NSLog(@"original time: %@", newTime);

//Add the following line to display the time in the local time zone
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"];
NSString* finalTime = [dateFormatter stringFromDate:newTime];
NSLog(@"%@", finalTime);    

[dateFormatter release];
Run Code Online (Sandbox Code Playgroud)

输出:

2011-10-19 22:05:15.107 Craplet[4231:707] original time: 2011-10-20 01:10:50 +0000
2011-10-19 22:05:15.116 Craplet[4231:707] 10/19/11 at 9:10PM
Run Code Online (Sandbox Code Playgroud)

  • 日志中测试应用程序的有趣名称! (9认同)

100*_*ams 14

本技术说明帮助我解决了同样的问题:https://developer.apple.com/library/ios/qa/qa1480/_index.html

简而言之,您需要在NSDateFormatter上设置3个内容:

  1. 语言环境
  2. 时区
  3. 日期格式

代码示例:

NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:locale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'"];

NSDate *date = [dateFormatter dateFromString:@"2014-10-23T01:10:50.000Z"];
Run Code Online (Sandbox Code Playgroud)

我只是通过设置时区和日期格式,使用NSDateFormatter成功地将UTC字符串解析为NSDate.当它突然停止工作时,我发现了这个技术说明,并添加了setLocal:这解决了我的问题.


MSc*_*ler 5

因为斯威夫特:

let dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
let dateHopefully = dateFormatter.dateFromString("2016-07-29T17:15:02Z")

dateFormatter.timeZone = NSTimeZone.systemTimeZone()
dateFormatter.dateFormat = "M/d/yy 'at' h:mma"
let lastTime = dateFormatter.stringFromDate(dateHopefully!)

print("Here is the hopeful date \(dateHopefully) and here is the lastTime \(lastTime)")
Run Code Online (Sandbox Code Playgroud)