كيفية تخزين التمور دون مرات في البيانات الأساسية

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

  •  22-07-2019
  •  | 
  •  

سؤال

ولقد تم في محاولة لايجاد وسيلة معقولة لتخزين البيانات اليومية باستخدام البيانات الأساسية على اي فون.

وبلدي التطبيق يتلقى البيانات في تنسيق CSV، مع تاريخ ولكن لا وقت:

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

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

ويمكنني بسهولة خلق NSDate دون الساعات والدقائق أو الثواني باستخدام NSDateComponents أو NSDateFormatter. ولكن حتى عندما كنت تعيين المنطقة الزمنية صراحة إلى UTC أو إلى صفر ثانية من GMT، إخراج تاريخ الإنشاء مع NSLog () <م> دائما لديه بلدي التوقيت المحلي مثل:

2009-07-29 00:00:00 +0100

لا أحد يعرف من طريقة أفضل لجعل NSDates دون المكونات الوقت؟ أو ربما أفضل طريقة لتخزين التواريخ؟

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

المحلول

وهناك قاعدة جيدة من التجربة البرمجة هي دائما تخزين التمور في UTC. لا يهم ما إذا كنت تستخدم البيانات الأساسية أم لا؛ عليك لا تزال لديها للقيام ببعض الأعمال لدروس التاريخ أبل حد كبير تمتص.

وتتمثل تواريخ داخليا إلى عدد من الثواني منذ تاريخ مرجعي الذي هو، في اعتقادي، 1 يناير 2001 00:00:00 (على الرغم من أن تاريخ المرجعية الفعلية ليست مهمة جدا). النقطة هي، كائنات NSDate دائما أصلا في UTC. إذا كانت التواريخ التي تحصل في ملف CSV الخاصة بك المحلية، سوف تحتاج إلى القيام بشيء من هذا القبيل للحصول على وقت UTC:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

وبعد ذلك، فما استقاموا لكم فاستقيموا ضبط الوقت إلى 00:00:00. الآن كنت أنت إنقاذ التاريخ، في منتصف الليل، في UTC. لأغراض العرض، سوف تستخدم NSDateFormatter تكوين مع المنطقة الزمنية من اختيارك (المنطقة الزمنية نظام هو الافتراضي إذا لم تقم بتحديد واحد) لعرض هذه التواريخ.

والمناطق الزمنية لا يهم حقا عندما كنت مجرد التعامل مع التواريخ، وبالرغم من ذلك. طالما أنك تأكد من تعيين المنطقة الزمنية على NSDateFormatter بك إلى UTC، فسوف تظهر دائما في نفس التاريخ، بغض النظر عن المنطقة الزمنية اختارت المستخدم على الجهاز لها.

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

لديك طن من الخيارات هنا، وأيا منها لا تنطوي على جهد كتابة استفساراتكم سكليتي الخاصة وقواعد البيانات.

نصائح أخرى

وهناك NSDate لايوجد المنطقة الزمنية. يستخدم NSLog المنطقة الزمنية المحلية. تقول +0100 لأن هذا هو المكان الذي تتواجد فيه.

والكائن NSDate سيتضمن دائما التاريخ الوقت - على حد تعبير المستندات أنه "يمثل [ق] نقطة واحدة في الوقت المناسب"، ويفعل ذلك عن طريق تخزين قيمة وقت مضى منذ تاريخ مرجعها (بداية من 1 يناير 2001 في GMT، مرة أخرى وفقا للمستندات). ولذلك لا يمكن أن يكون لها NSDate أن يجهل من الوقت من اليوم.

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

حسب تزال تستخدم NSDate كنت تستخدم فئة البيانات الأساسية يمكن أن تعمل مع أصلا، مما يعني أنه يمكن الاستمرار في استخدام المسندات بسهولة لتصفية أو فرز نتائج المنال حسب التاريخ دون الحاجة إلى التفكير صعبا للغاية حول هذا الموضوع.

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