当前位置:  开发笔记 > IOS > 正文

NSDateFormatter,我做错了什么或这是一个错误?

如何解决《NSDateFormatter,我做错了什么或这是一个错误?》经验,为你挑选了4个好方法。

我正在尝试以某种格式打印出日期:

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

如果将iPhone设置为24小时,这样可以正常工作,如果另一方面用户已将其设置为24小时时间,然后返回到上午/下午(它可以正常工作,直到您切换此设置)然后它会附加AM/PM尽管我没有要求它:

20080927030337 PM

我做错了什么或这是固件2.1的错误?

编辑1:使描述更清晰

编辑2解决方法:事实证明这是一个错误,修复它我将AM和PM字符设置为"":

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];

Toseef Khilj.. 29

此行为的原因是Locale,它设置正确的Locale.

NSDateFormatter的本地设置为en_US_POSIX将解决此问题.它适用于24小时和12小时格式.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set.来自apple doc

试试这个,

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];


huyz.. 14

以下是iPhone SDK错误的解释(3.1 beta SDK中仍然存在)

首先,介绍iPhone用户界面的一些背景知识.当iPhone用户在"美国"和"法国"之间更改其区域格式时,用户的"24小时时间"设置会自动切换到该区域中最常用的模式.在法国,将24小时时间设置为"开启",而在美国,则将其设置为"关闭".然后,用户可以手动覆盖该设置,这就是故障开始的地方.

问题来自于NSDateFormatter以某种方式在用户手动选择的12或24小时时间模式中"卡住".因此,如果法国用户手动选择12小时模式,并且应用程序请求NSDateFormatter输出24小时格式"HHmm"的时间,它实际上将以12小时格式接收时间,例如"01:00 PM",好像应用程序已经请求"hhmm aa".如果美国用户手动选择24小时模式,则会发生相反的情况:以12小时格式输出时间"hhmm aa"实际上会让您以24小时格式获得时间,例如"17:00".

可以在此博客上找到更多详细信息和可能的解决方法.



1> Toseef Khilj..:

此行为的原因是Locale,它设置正确的Locale.

NSDateFormatter的本地设置为en_US_POSIX将解决此问题.它适用于24小时和12小时格式.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set.来自apple doc

试试这个,

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];



2> huyz..:

以下是iPhone SDK错误的解释(3.1 beta SDK中仍然存在)

首先,介绍iPhone用户界面的一些背景知识.当iPhone用户在"美国"和"法国"之间更改其区域格式时,用户的"24小时时间"设置会自动切换到该区域中最常用的模式.在法国,将24小时时间设置为"开启",而在美国,则将其设置为"关闭".然后,用户可以手动覆盖该设置,这就是故障开始的地方.

问题来自于NSDateFormatter以某种方式在用户手动选择的12或24小时时间模式中"卡住".因此,如果法国用户手动选择12小时模式,并且应用程序请求NSDateFormatter输出24小时格式"HHmm"的时间,它实际上将以12小时格式接收时间,例如"01:00 PM",好像应用程序已经请求"hhmm aa".如果美国用户手动选择24小时模式,则会发生相反的情况:以12小时格式输出时间"hhmm aa"实际上会让您以24小时格式获得时间,例如"17:00".

可以在此博客上找到更多详细信息和可能的解决方法.


我在测试设备上证实了这一点.将国际环境改为英国.设置日期和时间24小时关闭以在您的应用中重现.我的解决方法是@DenNukem响应下面的设置语言环境为en_US为日期格式化程序.

3> Mike McMaste..:

使用您在模拟器和2.1固件和24小时时间设置为关闭的手机上发布的代码,当我这样做时,我从未在dateStr上附加AM/PM:

NSLog(@"%@", dateStr);

您是否正在使用dateStr执行其他任何未在此处发布的内容?你是如何检查价值的?

跟进

尝试打开am/pm设置然后关闭.在我这样做之前,我也没有问题.我打印出的方式和你一样.

好的,我也是这样看的.这必须是一个bug.我建议您提交错误报告,并在此期间检查并过滤掉不需要的字符.



4> DenNukem..:

将日期格式化程序上的语言环境设置为en_US可以解决我的问题:

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

我不确定是否还需要添加日历,但这很有效.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有