ios – 知道什么时候使用短的或全月的名字

在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中所示).

干杯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple 最新软件的错误和性能问题。
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只有5%的概率会遇到选择运营商界面且部分必须连接到iTunes才可以激活
一般在接外包的时候, 通常第三方需要安装你的app进行测试(这时候你的app肯定是还没传到app store之前)。
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应用变灰了。那么接下来我们看一下Flutter是如何实现的。Flutter中实现整个App变为灰色在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下:ColorFiltered(颜色过滤器)看名字就知道是增加颜色滤镜效果的,ColorFiltered( colorFilter:ColorFilter.mode(Colors.grey, BlendMode.
flutter升级/版本切换
(1)在C++11标准时,open函数的文件路径可以传char指针也可以传string指针,而在C++98标准,open函数的文件路径只能传char指针;(2)open函数的第二个参数是打开文件的模式,从函数定义可以看出,如果调用open函数时省略mode模式参数,则默认按照可读可写(ios_base:in | ios_base::out)的方式打开;(3)打开文件时的mode的模式是从内存的角度来定义的,比如:in表示可读,就是从文件读数据往内存读写;out表示可写,就是把内存数据写到文件中;
文章目录方法一:分别将图片和文字置灰UIImage转成灰度图UIColor转成灰度颜色方法二:给App整体添加灰色滤镜参考App页面置灰,本质是将彩色图像转换为灰度图像,本文提供两种方法实现,一种是App整体置灰,一种是单个页面置灰,可结合具体的业务场景使用。方法一:分别将图片和文字置灰一般情况下,App页面的颜色深度是24bit,也就是RGB各8bit;如果算上Alpha通道的话就是32bit,RGBA(或者ARGB)各8bit。灰度图像的颜色深度是8bit,这8bit表示的颜色不是彩色,而是256
领导让调研下黑(灰)白化实现方案,自己调研了两天,根据网上资料,做下记录只是学习过程中的记录,还是写作者牛逼
让学前端不再害怕英语单词(二),通过本文,可以对css,js和es6的单词进行了在逻辑上和联想上的记忆,让初学者更快的上手前端代码
用Python送你一颗跳动的爱心
在uni-app项目中实现人脸识别,既使用uni-app中的live-pusher开启摄像头,创建直播推流。通过快照截取和压缩图片,以base64格式发往后端。
商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;2.判断支付方式,如果是1,则是微信支付方式。1.判断是否在微信内支付,需要在微信外支付。
Mac命令行修改ipa并重新签名打包
首先在 iOS 设备中打开开发者模式。位于:设置 - 隐私&安全 - 开发者模式(需重启)
一 现象导入MBProgressHUD显示信息时,出现如下异常现象Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in ViewController.old: symbol(s) not found for architecture x86_64clang: error: linker command failed wit
Profiles >> 加号添加 >> Distribution >> "App Store" >> 选择 2.1 创建的App ID >> 选择绑定 2.3 的发布证书(.cer)>> 输入描述文件名称 >> Generate 生成描述文件 >> Download。Certificates >> 加号添加 >> "App Store and Ad Hoc" >> “Choose File...” >> 选择上一步生成的证书请求文件 >> Continue >> Download。
今天有需求,要实现的功能大致如下:在安卓和ios端实现分享功能可以分享链接,图片,文字,视频,文件,等欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~声明:本博文章若非特殊注明皆为原创原文链接。