NSDate는 년 / 월 / 일을받습니다.


291

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'년 / 월 / 일 을 얻는 것만 큼 간단한 것에 대한 많은 번거 로움으로 보입니다 . 다른 해결책이 있습니까?


4
첫 줄을 "NSCalendar * cal = [[NSCalendar alloc] initWithCalendarIdentifier : NSGregorianCalendar]]"로 변경할 때까지이 코드를 사용하는 데 약간의 문제가있었습니다. 이 질문이 있기 때문에 API가 변경되었을 것입니다.
Russell Thackston

@ futureelite7은 개정 1로 롤백되었습니다.이 코드는 역사적 목적을위한 것이며 초기 아이디어가 무엇인지에 대한 간단한 설명이었습니다.
Richard J. Ross III

코드가 더 이상 작동하지 않습니다. 올바른 코드를 메모 할 수 있습니까?
futureelite7

@ futureelite7 번호 그 코드는 내 첫 번째 시도를 보여 주었으며 결코 작동하지 않았습니다. 그것이 모호하다고 생각되면 코드 블록을 둘러싼 컨텍스트를 자유롭게 편집하되 코드 자체는 편집하지 마십시오. 코드 자체를 편집하는 것에 대해 매우 강한 생각이 든다면이 내용을 메타로 가져 가면 다른 개조자가 무엇을 말해야하는지 알 수 있습니다.
Richard J. Ross III

8
@ mike는 질문이 아닌 답변을 읽는 이유입니다.
Richard J. Ross III

답변:


615

이것은 가장 인기있는 대답이므로 약간 더 많은 정보를 포함하도록 편집하려고합니다.

그 이름에도 불구하고 그 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.


3
이를 수정하면 첫 번째 줄에는 NSWeekCalendarUnit 대신 NSDayCalendarUnit이 있어야합니다.
whitehawk

@Erik 어떤 달력을 사용하고 있습니까? 암호?
Itai Ferber

7
@Jonny 당신이 얻는 결과는 사용중인 캘린더에 따라 다릅니다. NSCalendar+currentCalendar방법은 시스템 캘린더를 반환하므로 사용자의 휴대 전화가 일본어 또는 태국어 시간 모드로 설정되어 있으면 연도가 다릅니다. 특정 캘린더 시스템을 강제 실행하려면 캘린더를 만들고 적절한 로캘로 초기화하십시오. 예를 들어, Gregorian 달력을 사용하려면 다음을 사용하십시오.[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Itai Ferber

2
NSDayCalendarUnit 열거 형 | NSMonthCalendarUnit | NSYearCalendarUnit은 더 이상 사용되지 않습니다. 대신 NSCalendarUnitDay를 사용하십시오.
Kunal Balani

2
경고 : 사용자에게 값을 표시하지 않으면 [NSCalendar currentCalendar]를 사용하지 마십시오. 사용자가 불교 달력 (현재는 2558 년 이상) 또는 다른 수의 홀수 달력을 따를 수 있습니다. 이 경우 앱이 중단되는 것을 원하지 않습니다. 특별한 이유가 없다면 gregorian calendar를 사용하십시오. 이 버그는 사용자와 테스터가 모두 기본적으로 gregorian을 사용할 수 있기 때문에 잡기가 어렵습니다.
n13

51

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


1
이 요점 으로 그의 확장 . 재미있게 --- 당신의 코드에 이것을 떨어 뜨릴 수 있습니다.
DogEatDog

사전에서 날짜를 조회하는 데 사용하는 문제를 해결했습니다. :) 감사합니다!
mlunoe의

1
실제로 항상 예상대로 100 % 작동하지 않습니다. 예를 들어, NSDate가 2013-12-31 00:00:00 +0000 인 경우 날짜의 실제 숫자가 2013 인 경우에도 형식화 된 날짜는 연도 2014를 반환합니다.
margusholland

예를 들어 4 월 10 일은 오늘의 요일을 어떻게 구할 수 있습니까? –
iOS 개발자

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        
}

4
포인터 비교의 결과는 추첨과는 거리가 멀다. 객체가 아닌 포인터를 비교하기 위해 의도 한 목적으로 사용하는 한 결과가 매우 잘 정의되어있다.
Richard J. Ross III

추첨이 아닐 수도 있지만 C #의 DateTime은 훨씬 직관적입니다. iOS에서, 연산자보다 적은 연산자는 두 개의 NSDate를 비교해야합니다. 두 사람이 두 개의 NSDate 변수의 포인터를 비교하고 싶습니까? 최소한 XCode 쇼는 이것이 실제로 사용자가 실제로 의미하는 것인지 묻는 경고를 표시합니다.
Mike Gledhill

1
그것은 그가 쓰는 언어의 기본을 이해하지 못하는 게으른 코더의 표시 일뿐입니다. 특히 ObjC 객체에 포인터 비교가 필요한 상황이 있습니다. 특히 사용자 정의 컨테이너를 만드는 경우 ARC에 문제가 생길 수 있습니다).
Richard J. Ross III

1
나는 기본을 이해하지 못하는 게으른 코더 여야하지만, 그것은 좋은 팁 마이크입니다!
Pier-Luc Gendreau

4
포인터 비교가 필요할 수 있지만 두 날짜를 비교할 때 훨씬 덜 일반적인 사용 사례입니다. 프로그래머가 포인터보다는 날짜를 비교하는 데 더 많은 시간을 투자하는 시간의 99.99 % 기본적으로 C #과 .NET 프레임 워크는 가장 일반적인 시나리오를보다 쉽게 ​​만들어 프로그래머가 생산성을 높이고 많은 경우 객관적인 느낌으로 인해 의도적으로 더 어려워지는 것처럼 느껴집니다. 모든 언어의 기본 사항에 대한 800 페이지 책을 읽을 시간이 있다면 건배이지만 나머지는 시간과 예산에 맞춰 제공 할 앱이 있습니다.
Crake

16

스위프트 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)

11

이 답변을 쓰는 ​​것은 옵션을 다시 제공하지 않는 유일한 방법이므로 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)

예를 들어 4 월 10 일은 오늘의 요일을 어떻게 구할 수 있습니까? –
iOS 개발자

예를 들어 일본어 달력의 연도 구성 요소는 1 자리를 반환합니다.
Flovettee

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)

2
놀랄 만한! @Yuchen Zhong
Lito

1
훌륭한 ! 더 나은 구문!
joan September

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

자세한 정보와 예제 는 iOS 8에서 NSDate 조작이 쉬워 진 것을 확인하십시오 . 면책 조항, 나는 게시물을 썼다.


예를 들어 4 월 10 일은 오늘의 요일을 어떻게 구할 수 있습니까? –
iOS 개발자

4

iOS 8.0 (및 OS X 10) 부터 구성 요소 방법을 사용하여 단일 날짜 구성 요소 가져 오기를 단순화 할 수 있습니다 .

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

일을 간단하고 희망적으로 만들면 효율적으로 구현됩니다.



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

그것은 분명히 연도, 월 또는 일을 정수로 제공하지 않으므로 OP에서 요청한 것입니다. -1.
Richard J. Ross III

1
Richard J. Ross III : 방금 고쳤습니다. 답변이 사라져서 죄송합니다.
Linh Nguyen

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) 

2

이 시도 . . .

코드 스 니펫 :

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

현재 연도, 월, 날짜를 제공합니다


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

1

스위프트 2.x

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

당신은 그것을 사용할 수 있습니다

NSDate().currentDateInDayMonthYear()

산출

6 March 2016

1

빠른

선택적 날짜로 날짜 요소를 가져 오는 쉬운 방법.

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

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

0

사람이 읽을 수있는 문자열 (일, 월, 년)을 얻으려면 다음을 수행하십시오.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.