代码之家  ›  专栏  ›  技术社区  ›  Richard J. Ross III

nsdate获取年/月/日

  •  283
  • Richard J. Ross III  · 技术社区  · 14 年前

    我怎样才能得到 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 回复  |  直到 7 年前
        1
  •  605
  •   Christian Schnorr    10 年前

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

    尽管它的名字, NSDate 它本身只是在机器时间上标记一个点,而不是日期。时间点与 新西兰 一年、一个月或一天。为此,你必须参考日历。任何给定的时间点都将根据您所查看的日历返回不同的日期信息(例如,公历和犹太日历中的日期不相同),尽管公历是世界上使用最广泛的日历-我假设-我们有点偏向于 新西兰 应该一直使用它。 新西兰 幸运的是,它是两党合作的产物。


    得到日期和时间是必须通过的 NSCalendar ,正如您提到的,但有一种更简单的方法可以做到:

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

    产生一个 NSDateComponents 对象,包含当前系统日历中当前日期的日期、月份和年份。( 注: 这不一定是电流 用户指定的 日历,只是默认系统1。)

    当然,如果您使用的是不同的日历或日期,您可以轻松地更改它。可用日历和日历单位的列表可在 NSCalendar Class Reference . 有关的详细信息 nsdateComponents(nsdateComponents) 可以在 NSDateComponents Class Reference .


    作为参考,从 nsdateComponents(nsdateComponents) 相当容易:

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

    你只需要注意: nsdateComponents(nsdateComponents) 不会包含您请求的任何字段的有效信息,除非您使用有效信息(即请求)生成这些字段 NSCANDENAR 提供信息 NSCalendarUnit s)。 nsdateComponents(nsdateComponents) 它们本身不包含任何参考信息——它们只是简单的结构,可以保存数字供您访问。例如,如果你还想要一个时代, nsdateComponents(nsdateComponents) ,您必须从 NSCANDENAR NSCalendarUnitEra 旗帜。

        2
  •  50
  •   vikingosegundo    10 年前

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

        3
  •  17
  •   Mike Gledhill    11 年前

    只是为了改写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        
    }
    
        4
  •  14
  •   NatashaTheRobot    9 年前

    在SWIFT 2中:

        let date = NSDate()
        let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
        let components = calendar.components([.Month, .Day], fromDate: date)
    
        let (month, day) = (components.month, components.day)
    
        5
  •  11
  •   Mitch Haile    7 年前

    我写这个答案是因为这是唯一一个不给你期权的方法 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)
    

    加分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)
    
        6
  •  8
  •   Yuchen    8 年前

    新的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)
    
        7
  •  4
  •   Joe Masilotti    9 年前

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

    首先创建一个 NSCANDENAR 使用任何东西 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];
    

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

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

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

        8
  •  4
  •   Christopher King    9 年前

    从iOS 8.0(和OS X 10)起,您可以使用 成分 简化获取单一日期组件的方法如下:

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

    应该使事情简单化,希望这能有效地实现。

        9
  •  2
  •   Community Mike Causer    7 年前

    如果您希望从nsdate获取各个nsdate组件,您肯定需要ITAI FERBER建议的解决方案。但是如果你想要 to go from NSDate directly to an NSString, you can use NSDateFormatter .

        10
  •  2
  •   Linh Nguyen    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);
    
        11
  •  2
  •   Nitin Nain    9 年前

    以下是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) 
    
        12
  •  2
  •   Sangram Shivankar Wostein    8 年前

    试试这个。…

    代码片段:

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

    它给出当前的年、月、日

        13
  •  1
  •   loretoparisi    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];
    
        14
  •  1
  •   Alserda    8 年前

    斯威夫特2

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

    你可以把它当作

    NSDate().currentDateInDayMonthYear()
    

    产量

    6 March 2016
    
        15
  •  0
  •   Shaik Riyaz    10 年前

    我是这样做的……

    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);
    
        16
  •  0
  •   mirap    7 年前

    要获取可读字符串(日、月、年),可以执行以下操作:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    NSString *string = [dateFormatter stringFromDate:dateEndDate];
    
        17
  •  0
  •   Krunal    7 年前

    迅捷

    将日期的任何元素作为可选字符串获取的简单方法。

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