DateByAddingComponents والحصول على اختلاف في التواريخ مع NSDateComponents

StackOverflow https://stackoverflow.com/questions/2512520

  •  22-09-2019
  •  | 
  •  

سؤال

أواجه مشاكل في إضافة قيم إلى التواريخ وأيضًا الحصول على الاختلافات بين التواريخ. التواريخ والمكونات المحسوبة غير صحيحة.

لذلك للإضافة ، إذا قمت بإضافة 1.5 شهرًا ، أحصل على شهر واحد فقط ، ولكن إذا قمت بإضافة أي رقم كامل IE (1 أو 2 أو 3 وما إلى ذلك) فإنه يحسب بشكل صحيح.

Float32 addAmount = 1.5;

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setMonth:addAmount];

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
 [gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

 NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:Date1 options:0];

الآن للاختلاف ، إذا كان لدي تاريخ تمت إضافته مع سنة واحدة بالضبط (نفس الرمز الوارد أعلاه) ، فإنه يضيف بشكل صحيح ، ولكن عندما يتم حساب الفرق ، أحصل على 0 و 11 شهرًا و 30 يومًا.

NSDate *startDate = Date1;
NSDate *endDate = Date2;

NSCalendar *gregorian = [[NSCalendar alloc]
          initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
              fromDate:startDate
                toDate:endDate options:0];

NSInteger years = [components year];
NSInteger months = [components month];
NSInteger days = [components day];

ما الخطأ الذي افعله؟ لقد أضفت أيضًا const kcfcalendarcomponentswrap constant في الخيارات لكل من وظائف الإضافة والاختلاف ولكن دون فرق.

شكرًا

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

المحلول

لذلك للإضافة ، إذا قمت بإضافة 1.5 شهرًا ، أحصل على شهر واحد فقط ، ولكن إذا قمت بإضافة أي رقم كامل IE (1 أو 2 أو 3 وما إلى ذلك) فإنه يحسب بشكل صحيح.

ال setMonth: الطريقة في NSDateComponents يأخذ NSInteger, ، وليس رقم نقطة عائمة. لذا فإن السلوك صحيح ، لأنه ببساطة يقطع 1.5 إلى 1.

الآن للاختلاف ، إذا كان لدي تاريخ تمت إضافته مع سنة واحدة بالضبط (نفس الرمز الوارد أعلاه) ، فإنه يضيف بشكل صحيح ، ولكن عندما يتم حساب الفرق ، أحصل على 0 و 11 شهرًا و 30 يومًا.

ما لم تُظهر الرمز لكيفية إنشاء متغيرات Date1 و Date2 ، فلا توجد طريقة حقيقية لمعرفة ذلك.

(أنت تتسرب أيضًا من الذاكرة أعلاه ؛ قم دائمًا بمطابقة تخصيص مع أ release/autorelease. وحاول ألا تمنح متغيراتك رسائل رأس المال ، لأن ذلك يجب القيام به فقط لأسماء الفصول الدراسية)

نصائح أخرى

لقد وجدت أخيرًا المشكلة مع اختلاف التاريخ ، عندما كنت أقوم بحفظه إلى DB ، استخدمت TimeIntervalsince1970 بقيمة مزدوجة ، ولكن عند ملءها ووضعها على DatePicker ، كنت أستخدم نوع عمود INT.

شكرا لضفدع أشعث لتوجيه لي في الاتجاه الصحيح.

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