在iOS 7或8下,股票日历应用程序会执行一些我无法确定的事情.

在某些地区,如en_US,日历应用程序显示短(3个字母)的月份名称.

在其他语言环境(例如de_DE)下,日历应用程序会显示完整的月份名称.有趣的是,语言环境en_DE显示了短的月份名称,因此它似乎与区域格式的语言相关联.

我不知道的是如何知道使用哪个月份格式.

不管我的设备的区域设置,NSDateFormatter独立的ShortMonthSymbols给了我3个字母的月份名称,NSDateFormatter standaloneMonthSymbols给了我完整的月份名称.

也试过:

Nsstring *monthformat = [NSDateFormatter dateFormatFromTemplate:@"LLL" options:0 locale:[NSLocale currentLocale]];

并且为en_US和de_DE返回相同的LLL.

看NSLocale,似乎没有任何价值决定是使用短名称还是全名.

NSCalendar,NSDateFormatter或NSLocale中似乎没有什么可以帮助确定要使用哪个月份格式.

有谁有任何想法如何做出这样的决心?

更新:

我以为我找到了一个解决方案,但它并不适用于我尝试的所有地区.我使用各种语言环境运行以下代码,以查看是否可以在本地应用程序中显示短和长的月份名称的区域设置之间找到任何共同点:

NSLocale *locale = [NSLocale currentLocale];
Nsstring *Locid = [locale localeIdentifier];
NSLog(@"Locale = %@",Locid);

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLog(@"monthSymbols = %@",[formatter monthSymbols]);
NSLog(@"shortMonthSymbols = %@",[formatter shortMonthSymbols]);
NSLog(@"veryShortMonthSymbols = %@",[formatter veryShortMonthSymbols]);
NSLog(@"monthStandalonesymbols = %@",[formatter standaloneMonthSymbols]);
NSLog(@"shortStandaloneMonthSymbols = %@",[formatter shortStandaloneMonthSymbols]);
NSLog(@"veryShortStandaloneMonthSymbols = %@",[formatter veryShortStandaloneMonthSymbols]);

NSDate *date = [NSDate date];
[formatter setDateStyle:NSDateFormatterShortStyle];
NSLog(@"short date style: %@",[formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"medium date style: %@",[formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterLongStyle];
NSLog(@"long date style: %@",[formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterFullStyle];
NSLog(@"full date style: %@",[formatter stringFromDate:date]);

[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setDateFormat:@"M"];
NSLog(@"M date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"MM"];
NSLog(@"MM date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"MMM"];
NSLog(@"MMM date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"MMMM"];
NSLog(@"MMMM date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"MMMMM"];
NSLog(@"MMMMM date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"L"];
NSLog(@"L date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"LL"];
NSLog(@"LL date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"LLL"];
NSLog(@"LLL date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"LLLL"];
NSLog(@"LLLL date format: %@",[formatter stringFromDate:date]);
[formatter setDateFormat:@"LLLLL"];
NSLog(@"LLLLL date format: %@",[formatter stringFromDate:date]);

我已经使用en_US,en_GB,es_ES,de_DE,fr_FR和it_IT进行了测试.法语和德语语言环境在日历应用程序中显示完整的月份名称,其余显示短名称.

测试代码看起来很有希望的一件事是,只有法国和德国的地区在shortMonthSymbols的末尾有一段时间.

那么我运行以下代码来查找在短月份符号中使用标点符号的所有区域设置:

NSMutableArray *hasDot = [[NSMutableArray alloc] init];
NSMutableArray *nodot = [[NSMutableArray alloc] init];
NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];
NSArray *locales = [NSLocale availableLocaleIdentifiers];
for (Nsstring *Locid in locales) {
    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:Locid];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setLocale:locale];
    NSArray *shortNames = [formatter shortMonthSymbols];
    //NSLog(@"locale: %@,short names: %@",Locid,shortNames[10]);
    Nsstring *nov = shortNames[10];
    unichar char1 = [nov characteratIndex:0];
    unichar charN = [nov characteratIndex:nov.length - 1];
    if ([letters characterIsMember:char1] && [letters characterIsMember:charN]) {
        [nodot addobject:Locid];
    } else {
        [hasDot addobject:Locid];
    }
}

NSLog(@"no dot: %@",[nodot sortedArrayUsingSelector:@selector(compare:)]);
NSLog(@"has dot: %@",[hasDot sortedArrayUsingSelector:@selector(compare:)]);

通过结果扫描,我发现荷兰语区域在短月份的符号中使用了一段时间.但是,对日历应用程序的快速测试显示,当设备设置为荷兰语(nl_NL)时,日历应用程序会显示较短的月份名称.啊.

更新2:

我已经测试了几个地方.以下显示长月名:

fr_FR,ru_RU,sv_SE(实际上是每种语言的所有语言环境)

以下(和我确定更多)显示短的一个月:

en_US,it_IT,nl_NL,ca_ES,uk_UA,ro_RO(实际上是每种语言的所有语言环境)

解决方法

一旦经常,有一个值得研究的问题. Rick,对于我,我调试了日历应用程序(可以使用附加到MobileCal进程来完成).这一切都归结于EventKitUI`CurrentLocaleRequiresUnabbrevatedMonthNames,其中回答了所需的问题.

我们来看看它的反汇编:

EventKitUI`CurrentLocaleRequiresUnabbrevatedMonthNames:
0x102c6bec7:  pushq  %rbp
0x102c6bec8:  movq   %rsp,%rbp
0x102c6becb:  pushq  %r15
0x102c6becd:  pushq  %r14
0x102c6becf:  pushq  %rbx
0x102c6bed0:  subq   $0xb8,%rsp
0x102c6bed7:  movq   0x14a3aa(%rip),%r15      ; (void *)0x0000000104e93070: __stack_chk_guard
0x102c6bede:  movq   (%r15),%rax
0x102c6bee1:  movq   %rax,-0x20(%rbp)
0x102c6bee5:  cmpq   $0x0,0x1c01fb(%rip)      ; CurrentLocaleRequiresUnabbrevatedMonthNames.usesFullLengthMonthNames + 6
0x102c6beed:  je     0x102c6beff               ; CurrentLocaleRequiresUnabbrevatedMonthNames + 56
0x102c6beef:  movb   0x1c01eb(%rip),%al       ; CurrentLocaleRequiresUnabbrevatedMonthNames.hasChecked
0x102c6bef5:  xorb   $0x1,%al
0x102c6bef7:  testb  $0x1,%al
0x102c6bef9:  je     0x102c6c0d6               ; CurrentLocaleRequiresUnabbrevatedMonthNames + 527
0x102c6beff:  movq   0x1b583a(%rip),%rdi      ; (void *)0x00000001025dae58: NSLocale
0x102c6bf06:  movq   0x1aef23(%rip),%rsi      ; "currentLocale"
0x102c6bf0d:  movq   0x14a524(%rip),%r14      ; (void *)0x0000000104945000: objc_msgSend
0x102c6bf14:  callq  *%r14
0x102c6bf17:  movq   %rax,%rdi
0x102c6bf1a:  callq  0x102d29920               ; symbol stub for: objc_retainAutoreleasedReturnValue
0x102c6bf1f:  movq   %rax,%rbx
0x102c6bf22:  movq   0x14a227(%rip),%rax      ; (void *)0x00000001025a3cd8: NSLocaleLanguageCode
0x102c6bf29:  movq   (%rax),%rdx
0x102c6bf2c:  movq   0x1ae12d(%rip),%rsi      ; "objectForKey:"
0x102c6bf33:  movq   %rbx,%rdi
0x102c6bf36:  callq  *%r14
0x102c6bf39:  movq   %rax,%rdi
0x102c6bf3c:  callq  0x102d29920               ; symbol stub for: objc_retainAutoreleasedReturnValue
0x102c6bf41:  movq   %rax,%r14
0x102c6bf44:  movq   %rbx,%rdi
0x102c6bf47:  callq  *0x14a4f3(%rip)           ; (void *)0x00000001049429b0: objc_release
0x102c6bf4d:  movq   0x1c0194(%rip),%rdi      ; __languagesRequiringUnabbreviatedMonthNames
0x102c6bf54:  testq  %rdi,%rdi
0x102c6bf57:  jne    0x102c6c0b0               ; CurrentLocaleRequiresUnabbrevatedMonthNames + 489
0x102c6bf5d:  leaq   0x15425c(%rip),%rax      ; @"ru"
0x102c6bf64:  movq   %rax,-0xd0(%rbp)
0x102c6bf6b:  leaq   0x1524ce(%rip),%rax      ; @"de"
0x102c6bf72:  movq   %rax,-0xc8(%rbp)
0x102c6bf79:  leaq   0x154260(%rip),%rax      ; @"fr"
0x102c6bf80:  movq   %rax,-0xc0(%rbp)
0x102c6bf87:  leaq   0x154272(%rip),%rax      ; @"fi"
0x102c6bf8e:  movq   %rax,-0xb8(%rbp)
0x102c6bf95:  leaq   0x154284(%rip),%rax      ; @"pt"
0x102c6bf9c:  movq   %rax,-0xb0(%rbp)
0x102c6bfa3:  leaq   0x154296(%rip),%rax      ; @"no"
0x102c6bfaa:  movq   %rax,-0xa8(%rbp)
0x102c6bfb1:  leaq   0x1542a8(%rip),%rax      ; @"nb"
0x102c6bfb8:  movq   %rax,-0xa0(%rbp)
0x102c6bfbf:  leaq   0x1542ba(%rip),%rax      ; @"nn"
0x102c6bfc6:  movq   %rax,-0x98(%rbp)
0x102c6bfcd:  leaq   0x1542cc(%rip),%rax      ; @"sv"
0x102c6bfd4:  movq   %rax,-0x90(%rbp)
0x102c6bfdb:  leaq   0x1542de(%rip),%rax      ; @"he"
0x102c6bfe2:  movq   %rax,-0x88(%rbp)
0x102c6bfe9:  leaq   0x1542f0(%rip),%rax      ; @"th"
0x102c6bff0:  movq   %rax,-0x80(%rbp)
0x102c6bff4:  leaq   0x154305(%rip),%rax      ; @"hi"
0x102c6bffb:  movq   %rax,-0x78(%rbp)
0x102c6bfff:  leaq   0x15431a(%rip),%rax      ; @"bn"
0x102c6c006:  movq   %rax,-0x70(%rbp)
0x102c6c00a:  leaq   0x15432f(%rip),%rax      ; @"mr"
0x102c6c011:  movq   %rax,-0x68(%rbp)
0x102c6c015:  leaq   0x154344(%rip),%rax      ; @"ur"
0x102c6c01c:  movq   %rax,-0x60(%rbp)
0x102c6c020:  leaq   0x154359(%rip),%rax      ; @"te"
0x102c6c027:  movq   %rax,-0x58(%rbp)
0x102c6c02b:  leaq   0x15436e(%rip),%rax      ; @"ta"
0x102c6c032:  movq   %rax,-0x50(%rbp)
0x102c6c036:  leaq   0x154383(%rip),%rax      ; @"gu"
0x102c6c03d:  movq   %rax,-0x48(%rbp)
0x102c6c041:  leaq   0x154398(%rip),%rax      ; @"kn"
0x102c6c048:  movq   %rax,-0x40(%rbp)
0x102c6c04c:  leaq   0x1543ad(%rip),%rax      ; @"ml"
0x102c6c053:  movq   %rax,-0x38(%rbp)
0x102c6c057:  leaq   0x1543c2(%rip),%rax      ; @"ne"
0x102c6c05e:  movq   %rax,-0x30(%rbp)
0x102c6c062:  leaq   0x1543d7(%rip),%rax      ; @"pa"
0x102c6c069:  movq   %rax,-0x28(%rbp)
0x102c6c06d:  movq   0x1b55ec(%rip),%rdi      ; (void *)0x00000001025d9cd8: NSArray
0x102c6c074:  movq   0x1ae5cd(%rip),%rsi      ; "arrayWithObjects:count:"
0x102c6c07b:  leaq   -0xd0(%rbp),%rdx
0x102c6c082:  movl   $0x16,%ecx
0x102c6c087:  callq  *0x14a3ab(%rip)           ; (void *)0x0000000104945000: objc_msgSend
0x102c6c08d:  movq   %rax,%rdi
0x102c6c090:  callq  0x102d29920               ; symbol stub for: objc_retainAutoreleasedReturnValue
0x102c6c095:  movq   0x1c004c(%rip),%rdi      ; __languagesRequiringUnabbreviatedMonthNames
0x102c6c09c:  movq   %rax,0x1c0045(%rip)      ; __languagesRequiringUnabbreviatedMonthNames
0x102c6c0a3:  callq  *0x14a397(%rip)           ; (void *)0x00000001049429b0: objc_release
0x102c6c0a9:  movq   0x1c0038(%rip),%rdi      ; __languagesRequiringUnabbreviatedMonthNames
0x102c6c0b0:  movq   0x1ae6c1(%rip),%rsi      ; "containsObject:"
0x102c6c0b7:  movq   %r14,%rdx
0x102c6c0ba:  callq  *0x14a378(%rip)           ; (void *)0x0000000104945000: objc_msgSend
0x102c6c0c0:  movb   %al,0x1c001b(%rip)       ; CurrentLocaleRequiresUnabbrevatedMonthNames.usesFullLengthMonthNames
0x102c6c0c6:  movb   $0x1,0x1c0013(%rip)      ; __overlayCalendarGeneration + 7
0x102c6c0cd:  movq   %r14,%rdi
0x102c6c0d0:  callq  *0x14a36a(%rip)           ; (void *)0x00000001049429b0: objc_release
0x102c6c0d6:  movb   0x1c0005(%rip),%al       ; CurrentLocaleRequiresUnabbrevatedMonthNames.usesFullLengthMonthNames
0x102c6c0dc:  movq   (%r15),%rcx
0x102c6c0df:  cmpq   -0x20(%rbp),%rcx
0x102c6c0e3:  jne    0x102c6c0f3               ; CurrentLocaleRequiresUnabbrevatedMonthNames + 556
0x102c6c0e5:  addq   $0xb8,%rsp
0x102c6c0ec:  popq   %rbx
0x102c6c0ed:  popq   %r14
0x102c6c0ef:  popq   %r15
0x102c6c0f1:  popq   %rbp
0x102c6c0f2:  retq   
0x102c6c0f3:  callq  0x102d29a1c               ; symbol stub for: __stack_chk_fail

您可以看到,它创建一个需要未经缩短的月份名称的语言环境数组.然后,它将比较当前区域设置是否是这些区域设置之一.

在代码中硬编码.

对于缩写月份,它使用LLL格式(如EventKitUI`CalStringForMonth所示),对于未缩短的月份,它使用LLLL格式(如EventKitUI`CalLongStringForMonth中所示).

干杯

ios – 知道什么时候使用短的或全月的名字的更多相关文章

  1. 对于NSManagedObject,Xcode 9构建了Date vs NSDate的问题

    Xcode9为模拟器与设备中的实体的Date类型属性生成不同的代码.我在coredata中将类设置为类别/扩展名下的codegen功能.直到Xcode8.3(最新)它一切正常.下面是Xcode9为属性自动生成的代码–在设备上:–和,在模拟器上:–有谁遇到过这个问题?对于一个有50个成员的项目来解决这个问题的最佳解决方案是什么,直到Xcode更新修复它?

  2. iOS兼容输入类型日期 – 设置最小值最大值

    我试图在UIWebViewiOS应用程序中使用jQueryMobile设置日期,值设置正确但最小和最大属性日期设置不起作用.和当我在模拟器上运行它时,当选择日期字段时,日期选择器可见,但未设置最小,最大日期.解决方法模拟器的safari不支持设置输入类型=“日期”的最小值和最大值.您可以通过导航到thissite并尝试控制来测试它.它(可能)可以在桌面浏览器上运行,但不会在模拟器的浏览器或UIWebView中运行.

  3. ios – 设置NSDataDetector的上下文日期

    假设今天是2014年1月20日.如果我使用NSDataDetector从“明天下午4点”字符串中提取日期,我将得到2014-01-21T16:00.大.但是,假设我希望NSDataDetector假装当前日期是2014年1月14日.这样,当我解析“明天下午4点”时,我将得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?

  4. ios – 如何自动生成日期属性为Date而不是NSDate的NSManagedObject子类?

    我目前正在将我的项目更新为Swift3,并且我将所有的NSDate方法和扩展都移动到Date以便在应用程序中保持标准.问题是我使用Xcode自动生成我的NSManagedobject子类,它生成日期属性为NSDate而不是Date.有没有办法用日期属性作为日期生成它?

  5. ios – 如何减去日期组件?

    今天是星期五,根据NSCalendar,这是6.我可以通过使用以下内容得到这个我怎么得到上周六的工作日组件,应该是7?

  6. iOS – 友好的NSDate格式

    我需要在我的应用程序中显示帖子的日期给用户,现在我用这种格式:“5月25日星期五”.如何格式化NSDate以阅读“2小时前”的内容?使其更加用户友好.解决方法NSDateFormatter不能做这样的事情;你将需要建立自己的规则.我想像:所以这是打印’x分钟前’或’x小时前’从日期起24小时,通常是一天.

  7. ios – NSDate得到上周,上个月的问题

    我需要从当前日期开始获得上一个礼拜.所以我找到了可以重新计算当前日期添加间隔的解决方案这个参数:[[NSDatedate]dateByAddingTimeInterval:-604800.0](前一周)[[NSDatedate]dateByAddingTimeInterval:-2629743.83](取得上个月)正如我想,为了让周,这种方法运行良好,没有任何问题,因为每周有七天,间隔没有改变.但

  8. ios – Swift 3 – 比较两个日期时使用<运算符

    当比较两个日期时,我可以比较使用>但不是

  9. ios – 如何通过在CloudKit中的creationDate进行查询?

    我想从CloudKit获取最后十分钟的公共/私人条目.我尝试了一些这样的效果,但失败了:但这会让我得到数据,但是我不知道我是查询一切,还是只是某种上限:我想能够查询一定的时间.这样做可能没有在客户端做创建排序逻辑吗?

  10. ios – NSDate比较,计算特定(本地)时区的“中间夜数”

    我在这里错过了什么吗?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部