سؤال

كيف يمكنني الحصول على العام/الشهر/يوم 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 علَم.

نصائح أخرى

يمكنك الحصول على مكون منفصل من NSDate باستخدام NSDateFormatter:

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 الممتاز (والعمل!) ، إليك ما يبدو عليه فئة Helper عينة ، لإرجاع عام قيمة متغير 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;
}

(لا أستطيع أن أصدق أننا مضطرون إلى كتابة وظائف تاريخ iOS الأساسية مثل هذا ، في عام 2013 ...)

شيء آخر: لا تستخدم <و> لمقارنة قيمتين nsdate.

ستقبل Xcode بسعادة مثل هذا الرمز (بدون أي أخطاء أو تحذيرات) ، لكن نتائجها هي يانصيب. أنت يجب استخدم وظيفة "مقارنة" لمقارنة NSDates:

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

في 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)

أنا أكتب هذه الإجابة لأن هذا هو النهج الوحيد الذي لا يعيدك اختيارات العودة من 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 طرق الراحة لتحقيق ذلك بتنسيق أكثر terse.

أولا إنشاء 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 سهلاً في iOS 8. إخلاء المسئولية ، كتبت المنشور.

اعتبارًا من iOS 8.0 (و OS X 10) يمكنك استخدام مكون طريقة تبسيط الحصول على مكون تاريخ واحد مثل:

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

يجب أن تجعل الأمور أكثر بساطة ونأمل أن يتم تنفيذ ذلك بكفاءة.

إذا كنت ترغب في الحصول على NSDateComponents الفردية من NSDATE ، فستحتاج بالتأكيد إلى الحل الذي اقترحه ITAI Ferber. ولكن إذا كنت تريد للانتقال من nsdate مباشرة إلى NSString ، يمكنك استخدام NSDateFormatter.

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

هذا هو الحل في سويفت:

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) 

جرب هذا . . .

قصاصة الكود:

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

يمنح السنة الحالية والشهر والتاريخ

حاول القيام بما يلي:

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

سويفت 2.x

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

يمكنك استخدامه كما

NSDate().currentDateInDayMonthYear()

انتاج |

6 March 2016

سريع

طريقة أسهل للحصول على أي عناصر من التاريخ كسلسلة اختيارية.

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

أفعل بهذه الطريقة ....

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

للحصول على سلسلة قابلة للقراءة البشرية (اليوم ، الشهر ، العام) ، يمكنك القيام بذلك:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top