[objective-c] NSDate는 년 / 월 / 일을받습니다.

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클래스 참조 에서 찾을 수 있습니다 . 더 자세한 정보 NSDateComponentsNSDateComponents클래스 레퍼런스 에서 찾을 수 있습니다 .


참고로 개별 구성 요소에 액세스하는 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 조작이 쉬워 진 것을 확인하십시오 . 면책 조항, 나는 게시물을 썼다.