提问



如果没有其他信息,如何获得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];


但这对于像NSDate的年/月/日这样简单的事情来说似乎有很多麻烦。还有其他解决办法吗?

最佳参考


因为这显然是我最受欢迎的答案,所以我会尝试编辑它以包含更多信息。


尽管它的名字,NSDate本身只是标记机器时间的一个点,而不是日期。 NSDate指定的时间点与年,月或日之间没有相关性。为此,您必须参考日历。任何给定的时间点将返回基于的不同日期信息。你正在看什么日历(日历在格里高利和犹太日历中都不一样),而格里高利历是世界上使用最广泛的日历 - 我假设 - 我们有点有偏见NSDate应该总是使用它。幸运的是,NSDate更加两党合作。





正如你所提到的那样,获取日期和时间必须通过NSCalendar,但有一种更简单的方法:


NSDateComponents *components = [**NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date**];


这将生成一个NSDateComponents对象,其中包含当天系统日历中当天的日,月和年。 (注意:这不一定是当前的用户指定的日历,只是默认的系统日历。)


当然,如果您使用不同的日历或日期,则可以轻松更改。可以在NSCalendar类参考中找到可用日历和日历单位的列表。有关NSDateComponents的更多信息可以可以在NSDateComponents类参考中找到。[54] [55]





作为参考,从NSDateComponents访问各个组件非常简单:


NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];


你只需要注意:NSDateComponents不会包含你要求的任何字段的有效信息,除非你用有效信息生成它们(即请求NSCalendarNSCalendarUnit提供该信息s)。NSDateComponents本身不包含参考信息 - 它们只是包含数字供您访问的简单结构。如果你想要一个时代,例如,NSDateComponents,你必须用NSCalendar标志从NSCalendar中提供生成器方法。

其它参考1


您可以使用NSDateFormatter获取NSDate的单独组件:


NSDateFormatter *df = [**NSDateFormatter alloc] init];

[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date**];

[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date**];

[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date**];


如果你想获得月份数而不是缩写,请使用MM。如果你想获得整数,请使用[myDayString intValue];

其它参考2


只是为了改写Itai的优秀(和工作!)代码,这是一个示例助手类的样子,返回给定NSDate变量的年值。


正如您所看到的,修改此代码以获得月份或日期非常容易。


+(int)getYear:(NSDate*)date
{
    NSDateComponents *components = [**NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];

    int year = [components year];
    int month = [components month];
    int day = [components day];

    return year;
}


(我不相信我们必须在2013年编写我们自己的基本iOS日期功能......)


另一件事:不要使用<和>来比较两个NSDate值。


XCode很乐意接受这样的代码(没有任何错误或警告),但其结果是乐透。您必须使用比较功能来比较NSDates:


if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}

其它参考3


在Swift 2.0中:


    let date = NSDate()
    let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
    let components = calendar.components([.Month, .Day], fromDate: date)

    let (month, day) = (components.month, components.day)

其它参考4


我正在写这个答案,因为它是唯一的方法,它不会从NSDateComponent变量中提供选项和/或强制解包这些变量(也适用于Swift 3)。


斯威夫特3


let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)


斯威夫特2


let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)


Bonus Swift 3有趣的版本


let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)

其它参考5


iOS 8中的新功能



ObjC


NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[**NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];


夫特


let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)

其它参考6


如果您的目标是iOS 8+,则可以使用新的NSCalendar便捷方法以更简洁的格式实现此目的。


首先创建NSCalendar并使用NSDate所需的任何内容。


NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];


您可以通过component:fromDate:单独提取组件


NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];


或者,更简洁,通过getEra:year:month:day:fromDate:使用NSInteger指针


NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];


有关更多信息和示例,请查看iOS 8中的NSDate Manipulation Made Easy。免责声明,我写了这篇文章。[56]

其它参考7


从iOS 8.0(和OS X 10)开始,您可以使用组件方法来简化获取单个日期组件,如下所示:


int year = [**NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date**];


应该使事情更简单,并希望这是有效实施。

其它参考8


如果您希望从NSDate获得单独的NSDateComponents,您肯定需要Itai Ferber建议的解决方案。但是如果你想直接从NSDate转到NSString,你可以使用NSDateFormatter。

其它参考9


    NSDate *currDate = [NSDate date];
    NSCalendar*       calendar = [**NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
    NSInteger         day = [components day];
    NSInteger         month = [components month];
    NSInteger         year = [components year];
    NSLog(@"%d/%d/%d", day, month, year);

其它参考10


这是Swift中的解决方案:


let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!

// Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)

var (year, month, date) = (components.year, components.month, components.day) 

其它参考11


请尝试以下方法:


    NSString *birthday = @"06/15/1977";
    NSDateFormatter *formatter = [**NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy"];
    NSDate *date = [formatter dateFromString:birthday];
    if(date!=nil) {
        NSInteger age = [date timeIntervalSinceNow]/31556926;
        NSDateComponents *components = [**NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
        NSInteger day = [components day];
        NSInteger month = [components month];
        NSInteger year = [components year];

        NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
    }
    [formatter release];

其它参考12


Swift 2.x


extension NSDate {
    func currentDateInDayMonthYear() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "d LLLL yyyy"
        return dateFormatter.stringFromDate(self)
    }
}


你可以用它


NSDate().currentDateInDayMonthYear()


产量


6 March 2016

其它参考13


尝试这个 。 。 。


代码段


 NSDateComponents *components = [**NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date**];
 int year = [components year];
 int month = [components month];
 int day = [components day];


它给出了当前的年,月,日

其它参考14


我这样做....


NSDate * mydate = [NSDate date];

NSCalendar * mycalendar = [**NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;

NSDateComponents * myComponents  = [mycalendar components:units fromDate:mydate];

NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);

其它参考15


要获得人类可读的字符串(日,月,年),您可以:


NSDateFormatter *dateFormatter = [**NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];

其它参考16


夫特


更容易获取日期的任何元素作为可选字符串。


extension Date {

  // Year 
  var currentYear: String? {
    return getDateComponent(dateFormat: "yy")
    //return getDateComponent(dateFormat: "yyyy")
  }

  // Month 
  var currentMonth: String? {
    return getDateComponent(dateFormat: "M")
    //return getDateComponent(dateFormat: "MM")
    //return getDateComponent(dateFormat: "MMM")
    //return getDateComponent(dateFormat: "MMMM")
  }


  // Day
  var currentDay: String? {
    return getDateComponent(dateFormat: "dd")
    //return getDateComponent(dateFormat: "d")
  }


  func getDateComponent(dateFormat: String) -> String? {
    let format = DateFormatter()
    format.dateFormat = dateFormat
    return format.string(from: self)
  }


}

let today = Date()
print("Current Year - \(today.currentYear)")  // result Current Year - Optional("2017")
print("Current Month - \(today.currentMonth)")  // result Current Month - Optional("7")
print("Current Day - \(today.currentDay)")  // result Current Day - Optional("10")