目标C的日期转换问题

时间:2013-04-30 21:46:50

标签: ios objective-c nsdate nsdateformatter

我遇到了奇怪的问题,如果我这样做的话:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy EEEE 'at' h:mm a"];
NSString *originalDate = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"In Date: %@",originalDate);
NSDate *newDate = [dateFormatter dateFromString:originalDate];
NSLog(@"Out Date: %@",[dateFormatter stringFromDate:newDate]);

我得到了这个输出:

In Date: April 30, 2013 Tuesday at 2:42 PM
Out Date: December 28, 1999 Tuesday at 2:42 PM

为什么我在使用相同的格式化程序将其转换为字符串并返回后会得到不同的日期?有没有办法让这种转换正常工作?

2 个答案:

答案 0 :(得分:4)

这是iOS 6中的一个错误。NSDateFormatter无法正确解析在字符串开头之外的任何地方都有工作日名称的日期格式。我刚才提交了一份错误报告。还在等待修复。

相同的格式适用于iOS 5。

更新:基于vikingosegundo的测试,我更新了自己的iOS测试。这似乎与OS X中的问题相同。工作日格式在开始时并不是一件简单的事情,如果工作日格式出现在年份格式之后,这是一个错误。

答案 1 :(得分:1)

我能够在Cocoa命令行程序中重现此问题

工作格式

  • @"EEEE MMMM d, yyyy 'at' h:mm a"
  • @"MMMM EEEE d, yyyy 'at' h:mm a"
  • @"MMMM d EEEE, yyyy 'at' h:mm a"

不起作用(与OP 报告的症状相同)

  • @"MMMM d, yyyy EEEE 'at' h:mm a"
  • @"MMMM d, yyyy 'at' h:mm a EEEE"

因此EEEE天名称说明符需要留在年份说明符中 Mac OS X 10.8.3上的Cocoa中也存在该错误


进一步测试复制和粘贴:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"MMMM d, yyyy 'at' h:mm a EEEE"];
        NSString *originalDate = [dateFormatter stringFromDate:[NSDate date]];
        NSLog(@"In Date: %@",originalDate);
        NSDate *newDate = [dateFormatter dateFromString:originalDate];
        NSLog(@"Out Date: %@",[dateFormatter stringFromDate:newDate]);
    }
    return 0;
}