5

我正在尝试调试大量使用日期的代码,这让我在调试器中比较了大量不同的NSDate值。调试器以 UTC 格式显示这些日期——例如:

date1 = (NSDate *) 0x01b11460 @"2012-02-15 18:55:00 +0000"

如果它在我的本地时区显示它们对我来说会容易得多,因为这就是我正在调试的测试代码似乎正在使用的。

我确实觉得我在这里遗漏了一些更基本的东西,所以我希望有人能启发我。提前致谢。

4

3 回答 3

1

虽然有点“hackish”,但您可以创建 NSDate 的子类并仅覆盖

-(NSString *)description;

方法以返回您想要的日期格式。

调试器并没有为你做任何特殊的解码,它只是调用它想要显示的对象的“描述”方法。一个方便的技巧......(这就是为什么我的所有对象都发布了适合在调试器中查看的简洁描述。)

于 2012-06-22T05:13:08.683 回答
1

最后,最有效的方法实际上是为 NSDate 添加一个类别,它只是覆盖该description方法以返回一个代表我当前时区中 NSDate 的字符串。我也将其设为 DEBUG,因为我真的只需要在调试时使用此覆盖。

这是我使用的 .h 文件:

#ifdef DEBUG

@interface NSDate (DebugHelper)

-(NSString *)description;

@end

#endif

和 .m 文件:

#ifdef DEBUG

#import "NSDate+DebugHelper.h"

@implementation NSDate (DebugHelper)

-(NSString *) description
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterShortStyle];
    return [dateFormatter stringFromDate:self];
}

@end

#endif

感谢 Jim Hayes 和 jrturton 的讨论和导致这个答案的想法。

于 2012-06-23T01:58:57.930 回答
0

只是做了同样的事情,但是我使用了 localTimeZone 而不是 systemTimeZone (请参阅文档以了解为什么它会稍微好一些)。此外,我注意到您正在分配 dateFormatter 对象,但从未释放它,这是一个泄漏。

这是我的分类方法:

-(NSString *) description;
{
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]autorelease];

    NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
    [dateFormatter setLocale:enUSPOSIXLocale]; 
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    [dateFormatter setTimeStyle:NSDateFormatterLongStyle];

    NSString *dateString = [dateFormatter stringFromDate:self];
    return dateString;
}
于 2013-01-15T04:26:43.997 回答