首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS 6 NSDateFormatter

IOS 6 NSDateFormatter
EN

Stack Overflow用户
提问于 2012-09-27 00:57:50
回答 1查看 2.2K关注 0票数 3

请帮助我处理IOS6上的数据格式化程序,请参阅下面的代码

代码语言:javascript
复制
NSString stringDate = @"12/31/9999"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateCheck = [dateFormatter dateFromString:stringDate]; 
NSLog(@"Date = %@", dateCheck);

输出是

代码语言:javascript
复制
Date = 1999-12-31 08:00:00 +0000

这是将字符串日期转换为12/31/9999时的输出。

从以前版本的IOS6中,输出是

代码语言:javascript
复制
Date = 9999-12-31 08:00:00 +0000 // Correct
EN

回答 1

Stack Overflow用户

发布于 2012-10-05 18:58:33

我为我公司的企业应用程序做了一个修正。

对于使用已知格式字符串的日期格式化程序,它应该修复此问题(就像我们使用这些字符串解析来自sqlite数据库的日期一样)。

然而,它不会解决以下问题:

  1. 将NSDateFormatters设置为真的isLenient。
  2. 使用样式而不是格式字符串进行解析的NSDateFormatters。

它似乎不会对iOS 5或5.1产生负面的副作用。在此之前,我还没有做过任何测试。但是,我确实有点混乱了NSDateFormatter的内部结构,所以这可能不会通过App提交过程。但是,如果您在Enterprise下编写程序(或者只是使用临时部署),这应该不是一个问题。此外,如果你开着isLenient,它也会设法避开,但不能保证你不会遇到任何问题。

我要强调,这是一个暂时的解决办法。我还没有在所有可能的情况下测试过这一点,所以您应该承担自己的风险来实现这一点。

我创建了以下类别:

NSDateFormatter+HotFix.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface NSDateFormatter (HotFix)

- (NSDate*)dateFromString:(NSString *)string;

@end

NSDateFormatter+HotFix.m

代码语言:javascript
复制
#import "NSDateFormatter+HotFix.h"
#import <objc/runtime.h>

@implementation NSDateFormatter (HotFix)

- (NSDate*)dateFromString:(NSString *)string
{
    if (!string) return nil;

    //HACK: Use the original implementation
    void* baseFormatter = nil;
    object_getInstanceVariable(self, "_formatter", &baseFormatter);
    if (!baseFormatter) return nil;

    //Use the underlying CFDateFormatter to parse the string
    CFDateRef rawDate = CFDateFormatterCreateDateFromString(kCFAllocatorDefault, (CFDateFormatterRef)baseFormatter, (CFStringRef)string, NULL);
    NSDate* source = (NSDate*)rawDate;

    //We do not support lenient parsing of dates (or styles), period.
    if (source && !self.isLenient && self.dateStyle == NSDateFormatterNoStyle && self.timeStyle == NSDateFormatterNoStyle)
    {
        //If it worked, then find out if the format string included a year (any cluster of 1 to 5 y characters)
        NSString* format = [self dateFormat];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"y{1,5}" options:NSRegularExpressionCaseInsensitive error:NULL];
        NSArray* matches = [regex matchesInString:format options:0 range:NSMakeRange(0, [format length])];

        if ([matches count] > 0)
        {
            for (NSTextCheckingResult* result in matches)
            {
                //Check for the y grouping being contained within quotes.  If so, ignore it
                if (result.range.location > 0 && result.range.location + result.range.length < [format length] - 1)
                {
                    if ([format characterAtIndex:result.range.location - 1] == '\'' && 
                        [format characterAtIndex:result.range.location + result.range.length + 1] == '\'') continue;
                }

                NSString* possibleYearString = [string substringWithRange:result.range];
                NSInteger possibleYear = [possibleYearString integerValue];

                if (possibleYear > 3500)
                {
                    NSCalendar* calendar = [NSCalendar currentCalendar];
                    NSDateComponents* dateComp = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:source];
                    dateComp.year = possibleYear;

                    return [calendar dateFromComponents:dateComp];
                }
            }
        }
    }

    return [source autorelease];
}

@end

它将取代现有的dateFromString方法的NSDateFormatter。它的工作方式是正常地解析字符串,然后检查formatString中是否包含一组年份格式字符。如果是这样的话,它会手动提取出这个年份,并检查它是否大于3500。最后,如果是这样的话,它将重写输出,使其具有正确解析的年份。

只需将其包含在您的项目中,它就会生效。您不需要将头导入到每个使用NSDateFormatter的文件中,只需在其中编译.m就可以修改类。如果您有其他更改dateFromString的类别:则无法定义该类的效果。

我希望这能帮到你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12612585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档