如果没有其他信息,我怎样才能获得 NSDate
对象的年/月/日?我意识到我可以用类似的东西做到这一点:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
但这对于像年度/月/日那样简单的事情似乎有很多麻烦 . 还有其他解决方案吗?
17 回答
因为这显然是我最受欢迎的答案,我会尝试编辑它以包含更多信息 .
尽管它的名字,
NSDate
本身只是标记机器时间点,而不是日期 .NSDate
指定的时间点与年,月或日之间没有相关性 . 为此,您必须参考日历 . 任何给定的时间点将根据您假设的日历返回不同的日期信息 - 我们有点偏向NSDate
应该始终使用它 . 幸运的是,NSDate
更加两党合作 .正如你所提到的,获取日期和时间必须通过
NSCalendar
,但有一种更简单的方法:这将生成一个
NSDateComponents
对象,其中包含当天系统日历中当天的日,月和年 . ( Note: 这不一定是当前用户指定的日历,只是默认的系统日历 . )当然,如果您使用的是其他日历或日期,则可以轻松更改 . 可以在NSCalendar Class Reference中找到可用日历和日历单位的列表 . 有关
NSDateComponents
的更多信息,请参见NSDateComponents Class Reference .作为参考,从
NSDateComponents
访问各个组件非常简单:您只需注意:
NSDateComponents
将不包含您要求的任何字段的有效信息,除非您使用该有效信息生成它们(即请求NSCalendar
以NSCalendarUnit
提供该信息) .NSDateComponents
本身不包含参考信息 - 它们只是包含数字供您访问的简单结构 . 如果你想要一个时代,例如,在NSDateComponents
之外,你必须使用NSCalendarUnitEra
标志从NSCalendar
提供生成器方法 .您可以使用NSDateFormatter获取NSDate的单独组件:
如果您希望获得月份数而不是缩写,请使用"MM" . 如果你想获得整数,请使用
[myDayString intValue];
只是为了重新命名Itai 's excellent (and working!) code, here' s样本助手类的样子,返回给定NSDate变量的年份值 .
正如您所看到的,修改此代码以获取月份或日期非常容易 .
(我无法相信我们必须在2013年编写我们自己的基本iOS日期函数......)
另一件事:不要使用<和>来比较两个NSDate值 .
XCode很乐意接受这样的代码(没有任何错误或警告),但其结果是乐透 . 您必须使用"compare"函数来比较NSDates:
在Swift 2.0中:
我'm writing this answer because it'是唯一没有从
NSDateComponent
变量返回选项和/或强制展开这些变量的方法(也适用于Swift 3) .斯威夫特3
斯威夫特2
Bonus Swift 3有趣的版本
iOS 8中的新功能
ObjC
Swift
如果您的目标是iOS 8,则可以使用新的
NSCalendar
便捷方法以更简洁的格式实现此目的 .首先创建一个
NSCalendar
并使用NSDate
是必需的 .您可以通过
component:fromDate:
单独提取组件或者,更简洁,通过
getEra:year:month:day:fromDate:
使用NSInteger
指针有关更多信息和示例,请查看NSDate Manipulation Made Easy in iOS 8 . 免责声明,我写了这篇文章 .
从iOS 8.0(和OS X 10)开始,您可以使用 component 方法来简化单个日期组件,如下所示:
应该使事情更简单,并希望这是有效实施 .
如果您希望从NSDate获得单独的NSDateComponents,您肯定需要Itai Ferber建议的解决方案 . 但如果你想要to go from NSDate directly to an NSString, you can use NSDateFormatter .
这是Swift中的解决方案:
试试这个 . . .
Code snippet:
它给出了当前的年,月,日
请尝试以下方法:
Swift 2.x
你可以用它
产量
我这样做....
要获得人类可读的字符串(日,月,年),您可以:
Swift
更容易获取日期的任何元素作为可选字符串 .