3

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

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

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

4

2 回答 2

4

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

相同的格式在 iOS 5 下也可以使用。

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

于 2013-04-30T21:59:00.167 回答
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;
}
于 2013-04-30T22:18:46.177 回答