【问题标题】:How can I use NSDateFormatter to generate 2012-07-28T23:59:00-06:00?如何使用 NSDateFormatter 生成 2012-07-28T23:59:00-06:00?
【发布时间】:2012-08-02 20:17:10
【问题描述】:

格式化此字符串的适当方法是什么:

2012-07-28T23:59:00-06:00

这是我正在使用的代码,日期格式化程序当前将 s.due_At 的值设置为 nil,并且两个 NSLog 都显示为 null。我从字典中得到了上面的字符串,确定我已经 NSLogged 了。

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setLocale:[NSLocale currentLocale]];
                [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
                s.due_At = [dateFormatter dateFromString:[assignmentData  objectForKey:@"due_at"]];


                NSLog(@"%@",[dateFormatter stringFromDate:s.due_At]);
                NSLog(@"%@",[dateFormatter dateFromString:[assignmentData objectForKey:@"due_at"]]);

如何解决这个问题以输出上述字符串?

【问题讨论】:

  • 您确定[assignmentData objectForKey:@"due_at"] 没有返回零吗?
  • 您的设备时间设置是多少? 24 小时还是上午/下午?我有同样的问题,它与时间格式有关,不幸的是我无法修复它。您是否尝试使用 setLocale 注释掉该行?
  • 是的,我绝对确定 [assignmentData objectForKey:@"due_at"] 正在返回一个字符串。我可以在本地创建一个字符串对象并 nslog 值。此外,如果我将本地创建的字符串发送到 NSLog(@"%@",[dateFormatter dateFromString:localString]) 我仍然得到空值。感谢您的帮助。
  • 是的,我确实提交了设置的语言环境,但无济于事。

标签: ios cocoa nsdate nsdateformatter


【解决方案1】:

Z 字面意思是 RFC 822 标准,它不允许您在小时和分钟之间使用 :

 zone        =  "UT"  / "GMT"                ; Universal Time
                                             ; North American : UT
             /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
             /  "CST" / "CDT"                ;  Central:  - 6/ - 5
             /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
             /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
             /  1ALPHA                       ; Military: Z = UT;
                                             ;  A:-1; (J not used)
                                             ;  M:-12; N:+1; Y:+12
             / ( ("+" / "-") 4DIGIT )    ; Local differential
                                             ;  hours+min. (HHMM)

【讨论】:

  • 是我可以使用的另一个文字还是我必须从字符串中删除时区?我宁愿保留它。谢谢
  • @xitzxmythicx 只有两个字面量:zZ,它们都与您的时区格式不兼容。一般来说,要清理字符串,您需要分析最终字符串的六个字符,如果遇到:,则尝试在完整字符串中查找GMT,因为: 可以像GMT+3:00 一样使用,如果有@最后是 987654330@,但完整字符串中没有 GMT,你删除这个 :,字符串就可以被解析了。
  • 非常抱歉,我不确定您在说什么。根据我的解释,只需删除字符串最后一部分/时区部分中的 : 并保留这一行 [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];。或者只指定 GMT+。请提供一个例子。
  • @xitzxmythicx 不幸的是我没有 objC 示例可以分享,您的理解是正确的:如果您确信时间戳格式永远不会改变,您可以简单地删除最后一个 : 或插入 GMT 两个它前面的字符。我试图描述一个通用的解决方案,它允许您使用相同的代码来解析正确的时间戳。
  • 感谢您的帮助。好的,所以我稍微更改了代码。这里是
【解决方案2】:

感谢您的帮助。好的,所以我稍微更改了格式化程序。这是代码。

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateStyle:NSDateFormatterShortStyle];
            [dateFormatter setLocale:[NSLocale currentLocale]];
            [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HHmmssZ"];


            s.due_At = [dateFormatter dateFromString:[[assignmentData objectForKey:@"due_at"] stringByReplacingOccurrencesOfString:@":" withString:@""]];

            NSLog(@"%@",[dateFormatter stringFromDate:s.due_At]);

Nslog 不再为空,尽管它仍然包含中间的 T。 这是现在的日志消息。

2012-07-29T015900-0400

【讨论】:

猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2012-07-08
  • 1970-01-01
  • 2021-07-05
  • 2021-09-04
  • 2021-06-11
相关资源
最近更新 更多