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
와 정보 제공 NSCalendarUnit
들). NSDateComponents
자체적으로 참조 정보가 포함되어 있지 않습니다. 액세스 할 수있는 간단한 구조입니다. 예를 들어의 시대를 벗어나고 싶다면 플래그로 NSDateComponents
생성기 메소드를 제공 NSCalendar
해야합니다 NSCalendarUnitEra
.
답변
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는 오류나 경고없이 그러한 코드를 기꺼이 받아들이지 만 결과는 추첨입니다. 당신은 해야한다 NSDates을 비교하기 위해 “비교”기능을 사용합니다 :
if ([date1 compare:date2] == NSOrderedDescending) {
// date1 is greater than date2
}
답변
스위프트 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의 경우).
스위프트 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)
보너스 스위프트 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];
자세한 정보와 예제 는 iOS 8에서 NSDate 조작이 쉬워 진 것을 확인하십시오 . 면책 조항, 나는 게시물을 썼다.