سؤال

ولقد وجدت في خلل في برنامج C ++ MFC القديم لدينا أن يحسب إزاحة (بالأيام) لتاريخ معين من تاريخ قاعدة ثابتة. كنا نرى نتائج التي كانت من جانب واحد لسبب ما، وأنا تعقب ذلك وصولا الى حيث مبرمج الأصلي قد استخدمت طريقة CTimeSpan.GetDays (). وفقا ل الوثائق :

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

ملحوظة أن التوقيت الصيفي يمكن أن يسبب GetDays لإرجاع نتيجة محتملة مثيرة للدهشة. على سبيل المثال، عندما DST هو في الواقع، وتقارير GetDays عدد الأيام بين 1 أبريل و 1 مايو إلى 29، وليس 30، وذلك لأن تقصير مدة يوم واحد في شهر أبريل من ساعة، وبالتالي لا يعتبر يوم كامل.

والإصلاح التي اقترحتها هو استخدام (obj.GetTotalHours()+1)/24 بدلا من ذلك. أعتقد أن من شأنها أن تغطي جميع القضايا بما أن هذه هي مهمة دفعي الذي يعمل في نفس الوقت تقريبا كل يوم، ولكنني اعتقدت أن نطلب من الناس الذكية هنا قبل تنفيذه إذا قد يكون هناك طريقة أفضل.

وهذه مجرد قضية جانبية، ولكن أنا أيضا غريبة كيف سيتم التعامل مع هذا إذا كان من الممكن تشغيل البرنامج في أي وقت.

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

المحلول

والإصلاح لديك يعمل بشكل جيد للحصول على عدد الفترات كلها على مدار 24 ساعة بين مرتين - طالما تحدث أحداث في نفس الوقت كل يوم. إلا أن "+1" في التعبير يمكن أن يؤدي إلى الخروج من جانب واحد خطأ.

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

CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0);
CTime finishDay(finish.GetYear(), finish.GetMonth(), finish.GetDay(), 0, 0, 0);
int days = ((finishDay - startDay).GetTotalHours() + 1) / 24;

نصائح أخرى

وهناك تغيير طفيف على ما اقترح مارك ويعمل بدون أي الاعتماد على التقريب: مجرد إضافة واحد المعلمة المزيد من صفر إلى منشئ CTime. هذا يفرض في كل مرة أن تكون في وقت قياسي (وليس الصيفي). القيمة الافتراضية لهذه المعلمة هي -1 التي تعني "حساب تلقائيا إذا كان الوقت الصيفي سارية المفعول."

// Discard hours, minutes, seconds, and daylight savings time
CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0, 0);
CTime endDay(end.GetYear(), end.GetMonth(), end.GetDay(), 0, 0, 0, 0);

// Get number of days apart
CTimeSpan span = endDay - startDay;
int nDays = span.GetDays();

واختبارها ويعمل.

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