jjzjj

IOS 6 的 NSDateFormatter

coder 2024-01-11 原文

请帮我解决 IOS6 上的 dateformatter,请看下面的代码

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

输出是

Date = 1999-12-31 08:00:00 +0000

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

从以前版本的IOS6输出是

Date = 9999-12-31 08:00:00 +0000 // Correct

最佳答案

我为我公司的企业应用程序修复了这个问题。

它应该为使用已知格式字符串的日期格式化程序解决这个问题(就像我们用来从我们的 sqlite 数据库中解析日期的那些)。

但是,它不会修复:

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

它似乎不会对 iOS 5 或 5.1 造成负面影响。在此之前我没有测试过任何东西。但是,我确实有点弄乱了 NSDateFormatter 的内部结构,所以这可能无法通过 App Store 提交过程。但是,如果您在 Enterprise 程序下编写程序(或者只是使用 ad hoc 部署),这应该不是问题。此外,如果您启用了 isLenient,它会尝试让开,但不能保证您不会遇到任何问题。

我想强调的是,这是一个临时解决方案。我没有在所有可能的情况下对此进行测试,因此您应自行承担实现此风险。

我创建了以下类别:

NSDateFormatter+HotFix.h

#import <Foundation/Foundation.h>

@interface NSDateFormatter (HotFix)

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

@end

NSDateFormatter+HotFix.m

#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

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

只需将其包含在您的项目中即可生效。您不需要将 header 导入到每个使用 NSDateFormatter 的文件中,只需编译 .m 即可修改该类。如果你有任何其他改变dateFromString:的类,那么这个类的效果就无法定义。

希望对您有所帮助。

关于IOS 6 的 NSDateFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12612585/

有关IOS 6 的 NSDateFormatter的更多相关文章

  1. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

  2. iOS适配Unity-2019 - 2

    iOS适配Unity-2019背景由于2019起,Unity的Xcode工程,更改了项目结构。Unity2018的结构:可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。Unity2019以后:Targets多了一个UnityFramework,UnityFramework管理三方库,Unity-iPhone依赖于UnityFramwork。所以升级后,会有若干的问题,以下是对问题的解决方式。问题一错误描述error:exportArchive:Missingsigningidentifierat"/var/folders/fr//T/Xcode

  3. ruby - Mac OS X/iOS 中的正则表达式匹配表情符号 - 2

    Note:thisquestioncouldlookoddonsystemsnotsupportingtheincludedemoji.这是HowdoIremoveemojifromstring的后续问题.我想构建一个正则表达式来匹配所有可以在MacOSX/iOS中输入的表情符号。明显的Unicodeblock涵盖了大部分,但不是所有这些表情符号:U+1F300..U+1F5FFMiscellaneousSymbolsAndPictographsU+1F600..U+1F64FEmoticonsU+1F650..U+1F67FOrnamentalDingbatsU+1F680..U+1

  4. iOS电话启动屏幕神秘图像 - 2

    当我的应用启动时,情节板启动屏幕显示我的图像如预期的,但部分被灰色盒子覆盖。有人可以让我知道图像框的来源吗?启动屏幕上唯一的东西是页面上的图像。这是屏幕截图:看答案您是否检查了启动图像是否损坏了?

  5. javascript - 在 iOS 应用程序中设置 cookie 并从 Safari 读取该 cookie - 2

    我正在尝试执行以下操作:在我的appDelegate中,我正在设置一个cookie。之后,我尝试使用来自网络应用程序的JavaScript读取该cookie。这可能吗?因为我不能让它工作...这是我在iOS应用程序中的代码:NSMutableDictionary*cookieProperties=[NSMutableDictionarydictionary];[cookiePropertiessetObject:@"test"forKey:NSHTTPCookieName];[cookiePropertiessetObject:@"yes"forKey:NSHTTPCookieValu

  6. javascript - iOS5 不支持 bind()! - 2

    我有一个客户有一台原装iPad,我注意到它doesn'tsupportthe.bindmethod.问:如果我的老板坚持支持IOS5.1.1,是否有其他方法可以将变量传递给回调?我不认为我可以简单地将变量放入全局范围,因为如果我在循环中,我设置的变量可能会覆盖回调正在寻找的同一个变量。 最佳答案 您可以使用MDN提供的实现,甚至可以使用您自己的实现。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bin

  7. javascript - 固定位置在 IOS 上延迟 - 2

    在我的网站上用iPad测试词缀后,我发现它不能正常工作,我用眼镜观察它是iOS的问题https://github.com/twbs/bootstrap/issues/11560目前还没有简单的解决方案。iOSjusthasproblemswithcalculatingfixedpositionasyouscroll.Basicallyyoudon'tgetanupdatedfixedpositionuntilaslightdelayafteryoustopscrolling有什么我可以做的让它工作吗,可能有人已经做了一些解决? 最佳答案

  8. javascript - 如何在 UIWebView iOS5 中预选 contenteditable 字段 - 2

    首先,我知道contenteditable仅适用于iOS5我已经说明了这一点-我们为iOS5用户提供了一项功能,允许使用contenteditable进行富文本粘贴。到目前为止,此功能非常有效,我想做的就是当View似乎将contenteditable字段设置为事件(预选)以便出现键盘并且用户可以立即开始键入。这是我用于UIWebView的本地html文件PLACEHOLDER我已经尝试使用一些javascript来完成此操作,使用我找到的用于预选文本输入的教程。我无法让它工作,即使我试图切换到文本输入字段进行测试。这可能是由于我对javascipt缺乏经验,所以如果这是解决方案,请明

  9. javascript - 如何防止 iOS 5 中 touchmove 事件的默认行为? - 2

    我有一个基于Web的应用程序,其中包含一个用户可以用手指上下滚动的组件。我使用事件的preventDefault方法来防止触摸移动在iOS设备上移动整个屏幕的默认行为。不幸的是,这在我今天早上刚升级到的iOS5中似乎不再有效。我不得不假设这在iOS5中的做法有所不同,但我还没有找到提供说明的资源。更新#1:我无法找到我的特定问题的答案,但我可以稍微调整我的代码以使用-webkit-overflow-scrolling样式(设置到“触摸”的值)并实现时髦的惯性滚动功能(其中内容滚动速度更快,具体取决于您的滑动速度,如果它触及边界,将“橡皮筋弹回”。看起来很酷...更新#2:我现在有另一个

  10. javascript - 检测 iPhone 5 及其以下的任何 iOS 设备 - 2

    Aquestion在SO上被问及iPhone4用户代理和iOS5.0用户代理。我使用以下方法检测不同的移动设备、视口(viewport)和屏幕。我希望能够区分iPhone5和所有其他iOS设备。据我所知,我用来检测iOS5.0用户代理variPhone5的行也适用于任何运行iOS5.0的iOS设备,所以从技术上讲它是不正确的。varpixelRatio=window.devicePixelRatio||1;varviewport={width:window.innerWidth,height:window.innerHeight};varscreen={width:window.scr

随机推荐