使用 NSDateFormatter 格式化月份和年份返回无效日期

Posted

技术标签:

【中文标题】使用 NSDateFormatter 格式化月份和年份返回无效日期【英文标题】:Formatting month and year using NSDateFormatter returns invalid date 【发布时间】:2012-04-10 06:42:01 【问题描述】:

我已经设置了语言环境和时区,但是当我格式化日期时,我总是得到无效的日期。月份始终为 12 月,年份比指定年份小一。就我而言,我不需要 day 组件。

我查看了其他类似的帖子,但没有解决问题。

感谢任何帮助。谢谢。

代码如下:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
[dateFormatter setDateFormat:@"MMM YYYY"];
NSDate *formattedDate = [dateFormatter dateFromString:@"Sep 2013"];
NSLog(@"Date: %@", [dateFormatter stringFromDate:formattedDate]);
[dateFormatter release]; dateFormatter = nil;

输出:日期:2012 年 12 月

【问题讨论】:

【参考方案1】:

“YYYY”格式用于基于“一年中的一周”的日历。改用“yyyy”格式说明符:

[dateFormatter setDateFormat:@"MMM yyyy"];

【讨论】:

@Vignesh,感谢您的链接。可能某些格式说明符对“一年中的一周”日历没有意义,从而导致不同的结果 感谢@Vlad 和 Vignesh 的回答。 但这并没有考虑到语言环境。知道我们如何在用户的语言环境中实现相同的目标吗? @user1366265 您需要先设置语言环境,然后设置日期格式。否则语言环境将以奇怪而奇妙的方式处理格式! :)【参考方案2】:

我只是想为 Vladimir 的出色回答添加一些内容。如果您在设置语言环境之前执行此操作,日期格式似乎会变得疯狂。我必须做的是在设置新格式之前设置语言环境,然后使用setDateFormat 根据使用的语言环境更改格式。所以这样的事情会做:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];//I wanted to set the locale to wherever user is using my app in
[formatter setDateFormat:@"MMM YYYY"];
NSDate *now = [NSDate Date];
NSString *fancyLookingDate = [formatter stringFromDate:now];

【讨论】:

我认为 [formatter setDateStyle:NSDateFormatterShortStyle];[formatter setTimeStyle:NSDateFormatterNoStyle]; 在您的代码中是多余的。如果使用setDateFormat,则之前调用设置日期样式和时间样式将被忽略。 @YuchenZhong 不知道,以为日期和时间是分开格式化的。感谢您的反馈。 @YuchenZhong 刚刚编辑了我的答案以反映您的评论。

以上是关于使用 NSDateFormatter 格式化月份和年份返回无效日期的主要内容,如果未能解决你的问题,请参考以下文章

NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写

关于NSDateFormatter的格式

iOS 中的 NSDateFormatter

iOS开发中的NSDateFormatter日期格式解析总结

NSDateFormatter 没有显示完整的月份名称,只有一位数字

如何根据语言环境仅显示日期的日期和月份?