سؤال

لقد قمت بتطوير تطبيق يعمل كثيرًا مع التواريخ ويقوم أيضًا بتخزينها كسلاسل في البيانات الأساسية باستخدام هذه الطريقة:

- (NSDate*) stringToDate{
   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
   [dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
   NSDate *date = [dateFormat dateFromString:self];

   return date;

}

يعد العمل مع التاريخ/الوقت أمرًا صعبًا للغاية - فقط فارق التوقيت بين النظام والتوقيت المحلي - على أي حال يجب أن تعتني الطريقة المذكورة أعلاه بذلك.(لذلك آمل أن يؤدي تنسيق NSDate إلى NSString إلى إرجاع التوقيت المحلي الصحيح بدلاً من النظر إلى متغير NSDate في مصحح الأخطاء والذي يُظهر اختلافًا لمدة ساعتين في حالتي)

هناك أيضًا العديد من الحسابات مثل هذا:

    NSCalendar *calendar = [NSCalendar currentCalendar];   <------

    NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate];

    NSInteger now_hour = [components hour];
    NSInteger now_minute = [components minute];
    NSInteger yearx =  [components year];
    NSInteger monthx =  [components month];
    NSInteger dayx =  [components day];

حيث أحتاج إلى تعيين/تغيير/إنشاء تواريخ/أوقات معينة، وإجراء العمليات الحسابية واسترجاعها/تخزينها في البيانات الأساسية مرة أخرى كسلاسل NS.

سؤالي هو حول استخدام التقويم المناسب.

هل يجب أن أكتب دائما:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

أو

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

و

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar];

خاصة.اعتمادًا على ما إذا كان التطبيق مستخدمًا في أوروبا/الولايات المتحدة الأمريكية مقابل الصين؟

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

المحلول

طريقتك stringToDate لن تعمل بالضبط في الواقع، انظر QA1480.نسخة مختصرة:ال NSDateFormatter لسوء الحظ، له دوران متناقضان بعض الشيء - فك تشفير تنسيقات نصية معينة وترميزها وتحويل تواريخ العرض.نظرًا لأن الأخير مرتبط بالإعدادات المحلية، فهو الإعداد الافتراضي.لضمان حصولك على السلوك السابق، يجب عليك تعيين en_US_POSIX locale، وهو ما يضمن احترام سلسلة التاريخ الخاصة بك تمامًا.

ومع ذلك، يبدو أنك في حيرة من أمرك بشأن ما هو NSDate يكون.انها ليست NSString أو أي تمثيل مكتوب آخر للتاريخ.إنه سجل تجريدي للحظة محددة.ولذلك فهو غير مرتبط تمامًا بالتقويم الحالي.سيؤثر تقويم المستخدم والإعدادات المحلية على كيفية طباعة التواريخ، لكنه لا يؤثر على التواريخ نفسها.الآن لا يزال الآن، كيفما تكتبه.لهذا السبب، عندما تقوم بتطبيق منسق على تاريخ، فإنك تحصل على تاريخ محلي صحيح، ولكن إذا قمت فقط بتسجيل تاريخ إلى وحدة التحكم، فستحصل على شيء مجرد وليس بالضرورة بمنطقتك الزمنية المحلية. NSDate ليس لديه مفهوم للمناطق الزمنية أو التقاويم المختلفة.

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

وفقًا لضمان الجودة، لتطبيق سلاسل تاريخ ثابتة، يجب عليك استخدام منسق التاريخ مع لغة محددة بوضوح وعدم التفكير في التقويم على الإطلاق.

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