首页 文章

NSDate获得年/月/日

提问于
浏览
280

如果没有其他信息,我怎样才能获得 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 回答

  • 10
    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);
    
  • 2

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

    尽管它的名字, NSDate 本身只是标记机器时间点,而不是日期 . NSDate 指定的时间点与年,月或日之间没有相关性 . 为此,您必须参考日历 . 任何给定的时间点将根据您假设的日历返回不同的日期信息 - 我们有点偏向 NSDate 应该始终使用它 . 幸运的是, NSDate 更加两党合作 .


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

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

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

    当然,如果您使用的是其他日历或日期,则可以轻松更改 . 可以在NSCalendar Class Reference中找到可用日历和日历单位的列表 . 有关 NSDateComponents 的更多信息,请参见NSDateComponents Class Reference .


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

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

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

  • 8

    您可以使用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];

  • 50

    只是为了重新命名Itai 's excellent (and working!) code, here' s样本助手类的样子,返回给定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很乐意接受这样的代码(没有任何错误或警告),但其结果是乐透 . 您必须使用"compare"函数来比较NSDates:

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

    在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)
    
  • 3

    我'm writing this answer because it'是唯一没有从 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)
    
  • 2

    iOS 8中的新功能

    ObjC

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

    Swift

    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)
    
  • 0

    如果您的目标是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];
    

    有关更多信息和示例,请查看NSDate Manipulation Made Easy in iOS 8 . 免责声明,我写了这篇文章 .

  • 0

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

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

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

  • 2

    如果您希望从NSDate获得单独的NSDateComponents,您肯定需要Itai Ferber建议的解决方案 . 但如果你想要to go from NSDate directly to an NSString, you can use NSDateFormatter .

  • 1

    这是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)
    
  • 4

    试试这个 . . .

    Code snippet:

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

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

  • 16

    请尝试以下方法:

    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];
    
  • 2

    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
    
  • 0

    我这样做....

    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);
    
  • 1

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

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

    Swift

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

    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")
    

相关问题