我如何获得一个年的年/月/天 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 类参考.


作为参考,从 NSDateComponents 很容易:

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

您只需要注意: NSDateComponents 除非您使用该有效信息生成了您要求的任何字段的有效信息(即请求 NSCalendar 提供这些信息 NSCalendarUnitS)。 NSDateComponents 本身不包含参考信息 - 它们只是简单的结构,这些结构可容纳您的数字供您访问。例如,如果您还想获得一个时代 NSDateComponents, ,您必须从 NSCalendarNSCalendarUnitEra 旗帜。

其他提示

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

只是为了重新定位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会愉快地接受此类代码(没有任何错误或警告),但其结果是彩票。你 必须 使用“比较”函数比较NSDATE:

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

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

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

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

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

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)

如果您针对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];

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

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

有关更多信息和示例,请查看 NSDATE操纵在iOS 8中变得容易. 。免责声明,我写了这篇文章。

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

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

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

如果您希望从NSDATE获得单独的NSDATECOMPONTENT,那么您肯定需要ITAI FERBER建议的解决方案。但是如果你愿意 要从NSDate直接转到NSString,您可以使用NSDateFormatter.

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

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

试试这个 。 。 。

代码段:

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

它提供当前年份,日期

尝试以下操作:

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

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

迅速

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

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

我这样做...

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

要获取人类可读的弦(日,月,年),您可能会这样做:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top