سؤال

يبدو وكأنه شيء بسيط ولكن لا يمكنني إيجاد طريقة للقيام بذلك.

سيكون من الرائع رؤية طرق مختلفة.

هل كانت مفيدة؟

المحلول

@إجابة تشاك صحيحة ، وقادني إلى الكود التالي. اعتقدت أنني سأشارك:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

نصائح أخرى

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

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

نأمل أن يكون هذا سوف تساعدك على الخروج.

إذا كنت تتحدث عن تاريخ تقويم معين بدلاً من تاريخ Unixy ، فربما تريد NSCALENDAR dateFromComponents:.

أمثلة سريعة

الأمثلة غالبًا ما تكون أسهل طريقة للتعلم. وفيما يلي بعض الأمثلة على ذلك.

الآن

هذا هو الأسهل.

let currentDateTime = Date()

20 فبراير 2017

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1 أبريل 1976

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

بحاجة إلى مزيد من التفاصيل ...؟

هناك طرق أخرى لإنشاء تواريخ أيضًا. إذا كنت تريد تعلم ذلك ، وكذلك كيفية عرض تاريخ ، ثم انظر إجابتي الكاملة.

انظر الوثائق ل nsdate. يمكنك استعمال ال dateFromString: طريقة NSDateFormatter أو ال dateFromComponents: طريقة NSCalendar.

لقد وجدت هذا الموضوع أثناء البحث عن إجابة على هذا السؤال ، لكنني وجدت مثالاً جيدًا في كتاب برمجة برمجة Big Nerd Ranch Comphive-C. الفضل لهم ، وليس أنا.

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];

إنه أمر مثير للسخرية ، أليس كذلك؟

منتصف عام 2013 و Apple ما يزال لم يوفر طريقة بسيطة لتعيين قيمة nsdate.

خلال مشروع iPad الحالي الخاص بي ، لم أستطع أن أصدق أنه كان علي التوقف عن الإنتاجية لفترة من الوقت لكتابة فصل المساعد الخاص بي للحصول على قيمة العام من NSDate. أعني ، هيا ، هذه أشياء أساسية.

على أي حال ، إليك فئة المساعد التي استخدمتها في مشروعي ، لتحويل سلسلة إلى قيمة nsdate:

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

باستخدام هذا الرمز ، يمكنك تعيين قيمة nsdate باستخدام شيء مثل:

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

ملاحظة: استندت هذه الوظيفة إلى التعليمات البرمجية المأخوذة من هنا:https://stackoverflow.com/a/3968411/391605

بلدي الحل كان لاستخدام الرمز التالي ، لكنني وجدت ذلك أحيانا, ، لن يحلل ، وستعود لا شيء.

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

أتذكر أنه فشلت فشلاً ذريعًا في "12 أكتوبر 2012" ... وهذا هو السبب في أنني استسلمت واستخدمت الوظيفة الأكثر تعقيدًا "المحلية" الموضحة أعلاه.

وجهة نظري هي ... كن حذرا.

بعض وظائف NSDATE للغاية لا تعمل بشكل صحيح ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top