如果没有其他信息,如何获取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
年/月/日这样简单的事情来说似乎有很多麻烦。还有其他解决方案吗?
答案 0 :(得分:605)
因为这显然是我最受欢迎的答案,所以我会尝试编辑它以包含更多信息。
尽管它的名字,NSDate
本身只是标记机器时间的一个点,而不是日期。 NSDate
指定的时间点与年,月或日之间没有相关性。为此,您必须参考日历。任何给定的时间点将根据您正在查看的日历返回不同的日期信息(例如,在格里高利历和犹太历的日历中日期不同),而格里高利历是最常用的日历。世界 - 我假设 - 我们有点偏向NSDate
应该总是使用它。幸运的是,NSDate
更加两党合作。
正如您所提到的,获取日期和时间必须通过NSCalendar
,但有一种更简单的方法:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
生成一个NSDateComponents
对象,其中包含当天系统日历中当天的日,月和年。 (注意:这不一定是当前的用户指定的日历,只是默认的系统日历。)
当然,如果您使用的是其他日历或日期,则可以轻松更改。可以在NSCalendar
Class Reference中找到可用日历和日历单元的列表。有关NSDateComponents
的更多信息,请参阅NSDateComponents
Class Reference。
作为参考,访问NSDateComponents
中的各个组件非常简单:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
您必须注意:NSDateComponents
不会包含您要求的任何字段的有效信息,除非您使用该有效信息生成它们(即请求NSCalendar
以NSCalendarUnit
提供该信息1}}为s)。 NSDateComponents
本身不包含参考信息 - 它们只是包含数字供您访问的简单结构。例如,如果您想要获得NSDateComponents
之外的时代,则必须使用NSCalendar
标记从NSCalendarUnitEra
提供生成方法。
答案 1 :(得分:50)
您可以使用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 :(得分:17)
只是改写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 :(得分:14)
在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 :(得分:11)
我正在写这个答案,因为这是唯一的方法,它不会从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)
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 :(得分: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 :(得分:4)
从iOS 8.0(和OS X 10)开始,您可以使用组件方法来简化单个日期组件,如下所示:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
应该使事情更简单,并希望这是有效实施的。
答案 7 :(得分:4)
如果您的目标是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 Manipulation Made Easy in iOS 8。免责声明,我写了这篇文章。
答案 8 :(得分:2)
如果您希望从NSDate获得单独的NSDateComponents,您肯定需要Itai Ferber建议的解决方案。但是如果你想要to go from NSDate directly to an NSString, you can use NSDateFormatter。
答案 9 :(得分:2)
这是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)
答案 10 :(得分:2)
试试这个。 。
代码段:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
它提供当前年,月,日
答案 11 :(得分:2)
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);
答案 12 :(得分:1)
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 :(得分:1)
尝试以下方法:
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 :(得分: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);
答案 15 :(得分:0)
要获得人类可读的字符串(日,月,年),您可以这样做:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
答案 16 :(得分:0)
<强>夫特强>
更容易将任何日期元素作为可选字符串。
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")