web-dev-qa-db-ja.com

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の年/月/日を取得するのと同じくらい簡単なものにとって、非常に面倒なことのようです。他に解決策はありますか?

284

これは明らかに私の最も一般的な答えなので、もう少し情報を含めるように編集します。

その名前にもかかわらず、NSDate自体は、日付ではなく、単にマシンタイムのポイントをマークするだけです。 NSDateで指定された時点と年、月、または日との間に相関関係はありません。そのためには、カレンダーを参照する必要があります。特定の時点では、見ているカレンダーに基づいて異なる日付情報が返され(たとえば、グレゴリオ暦とユダヤ暦の両方で日付は同じではありません)、グレゴリオ暦が最も広く使用されているカレンダーです。 world - 私は推測しています - 私たちはNSDateが常にそれを使うべきだと少し偏っています。幸いなことに、NSDateははるかに超党派的です。


あなたが述べたように、日付と時刻を取得することはNSCalendarを通過しなければならないでしょう、しかしそれをするより簡単な方法があります:

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

これは、現在のシステムカレンダから現在の日の日、月、年を含むNSDateComponentsオブジェクトを生成します。 (注:これは必ずしも現在のユーザー指定のカレンダーではなく、デフォルトのシステムカレンダーだけです。 。)

もちろん、別のカレンダーや日付を使用している場合は、それを簡単に変更できます。利用可能なカレンダーとカレンダー単位のリストは NSCalendarクラスリファレンス にあります。 NSDateComponentsの詳細については、 NSDateComponents Class Reference を参照してください。


参考までに、NSDateComponentsから個々のコンポーネントにアクセスするのはかなり簡単です。

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

注意してください。NSDateComponentsには、その有効な情報を使用してフィールドを生成しない限り、要求したフィールドの有効な情報は含まれません(つまり、NSCalendarNSCalendarUnitsを付けてその情報を提供する)。 NSDateComponentsはそれ自体には参照情報を含みません - それらはあなたがアクセスするための番号を保持する単なる単純な構造です。例えばNSDateComponentsから時代を迎えたい場合は、NSCalendarフラグでNSCalendarUnitEraからジェネレーターメソッドを供給する必要があります。

606
Itai Ferber

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];を使用してください。

50
skocko76

Itaiの優れた(そして動作中の)コードを書き換えるために、与えられたNSDate変数のyear値を返すために、サンプルのヘルパークラスがどのように見えるかを示します。

ご覧のとおり、月や日を取得するためにこのコードを変更するのは十分簡単です。

+(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基本日付関数を作成する必要があるとは思えませんが...)

もう1つのこと:2つのNSDate値を比較するために<と>を使わないでください。

XCodeはそのようなコードを(エラーや警告なしに)喜んで受け入れますが、その結果は宝くじです。あなた必須 NSDatesを比較するために "compare"関数を使う:

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

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)
14
NatashaTheRobot

私はこの答えを書いています。なぜならそれはNSDateComponent変数からオプショナルを返さない、あるいはそれらの変数をアンラップすることを強制しない唯一のアプローチだからです。

スイフト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)
11
Kevin

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)
8
Yuchen Zhong

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
Joe Masilotti

IOS 8.0(およびOS X 10)以降では、componentメソッドを使用して単一の日付コンポーネントを簡単に取得できます。

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

物事を単純にし、うまくいけばこれは効率的に実装されるべきです。

4

これが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
Nitin Nain

あなたがNSDateから個々のNSDateComponentsを得たいと思うなら、あなたは間違いなくItai Ferberが提案する解決策を必要とするでしょう。しかし、もしあなたが望めば NSDateから直接NSStringへ行くために、あなたはNSDateFormatterを使うことができます

2
gumbo

これを試して 。 。 。

コードスニペット:

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

現在の年月日

2
Yogeesh H T
    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);
2
Linh Nguyen

以下を試してください。

    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
loretoparisi

スイフト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
Alserda

速い

任意の日付要素をオプションの文字列として取得するためのより簡単な方法。

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
Krunal

こうやって…….

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
Shaik Riyaz

人間が読める形式の文字列(日、月、年)を取得するには、次のようにします。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
0
mirap