سؤال

انا مضيفا تكرار الأحداث الكاكاو التطبيق أنا أعمل على.لقد كرر كل يوم و أسبوع بخير لأني أستطيع تحديد هذه رياضيا (3600*24*7 = 1 أسبوع).استخدام التعليمات البرمجية التالية إلى تعديل التاريخ:

[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]

أنا أعرف كيف لقد مرت عدة أشهر منذ هذا الحدث كان يتكرر ولكن أنا لا يمكن معرفة كيفية جعل NSDate الكائن الذي يمثل شهر 1/3 أشهر/6 أشهر/9 أشهر في المستقبل.ومن الناحية المثالية كنت تريد المستخدم أن أقول كرر الشهرية ابتداء من أكتوبر.14 وسوف أكرر 14 من كل شهر.

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

المحلول

و(تقريبا نفس هذا السؤال ).

الوثائق :

<اقتباس فقرة>   

واستخدام NSCalendarDate بقوة   محبط. لم يتم إهمال حتى الآن،   ولكن قد يكون في نظام التشغيل الرئيسي القادم   الافراج عن بعد ماك OS X v10.5. إلى عن على   حسابات أيام السنة، يجب عليك   استخدام تركيبات مناسبة لل   NSCalendar، NSDate، و   NSDateComponents، كما هو موضح في   التقويمات في وتايمز   برمجة موضوعات ل الكاكاو .

وبعد هذه النصيحة:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth];

NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today];

nextMonthComponents.day = todayDayComponents.day;
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release];

قد يكون هناك تنفيذ أكثر مباشرة أو كفاءة، ولكن هذا يجب أن تكون دقيقة، وينبغي أن نشير في الاتجاه الصحيح.

نصائح أخرى

استخدم NSCalender، NSDateComponents وNSDate:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

ومجرد تعيين خصائص مختلفة من components للحصول على فترات زمنية مختلفة (على سبيل المثال، 3 أشهر، 6 أشهر، الخ).

ملحوظة: اعتمادا على السياق، قد ترغب في استخدام [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease] بدلا من [NSCalendar currentCalendar]، إذا كان عن طريق "1 شهر" تعني "1 الشهر حسب التقويم الغريغوري"

.

وأنا ربما استخدام NSCalendarDate.

والحصول على موعد في التيار dayOfMonth، monthOfYear وyearOfCommonEra، وثلاثة أرقام.

وإضافة العدد المطلوب من أشهر (1/3/6/9)، ورعاية 1) ما إذا كان هذا التاريخ موجودة (على سبيل المثال 31 أبريل، 29 فبراير عن العام غير الكبيسة)، و 2) ترحيل من العام.

إنشاء هذا التاريخ الجديد مع initWithYear NSCalendarDate في: الشهر: اليوم: ساعة: دقيقة: الثانية: المنطقة الزمنية:

NSCalendarDate لم يعد معتمدا من قبل SDK الجديدة , سوف يكون لديك مشكلة في حين أن بناء للتوزيع.

ويمكنك أن تفعل مثل أدناه:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:nextMonth];
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

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