كم عمرك؟ نفهم العمر في C# مرة واحدة وإلى الأبد
\n\nقد يبدو الأمر بسيطًا: خذ التاريخ الحالي، اطرح تاريخ الميلاد، واحصل على العمر. لكن أي مطور كتب حساب العمر في C# مرة واحدة على الأقل، واجه المفاجأة. جرب طرح السنوات فقط - وستحصل على خطأ في عيد الميلاد. وماذا عن السنوات الكبيسة؟ وماذا عن الأشخاص المولودين في 29 فبراير؟
\n\nهذا السؤال هو نجم حقيقي على Stack Overflow. حصل على آلاف المشاهدات وعشرات الإجابات. لماذا؟ لأن حساب العمر حسب تاريخ الميلاد في C# بشكل صحيح أصعب مما يبدو. في هذه المقالة، لن نقدم فقط كودًا جاهزًا. سنشرح أفضل الممارسات لعام 2025، ونعلمك تجنب الأخطاء، ونوضح كيفية كتابة كود نظيف وموثوق لا يخذلك في الإنتاج.
\n\nهيا بنا! 🚀
\n\nلماذا لا يعمل الطرح البسيط؟ (وكيفية إصلاحه)
\n\nالخطأ الأكثر شيوعًا للمبتدئين هو استخدام الطرح الخام للسنوات:
\n\nint age = DateTime.Now.Year - birthday.Year;\n\nللوهلة الأولى، يبدو منطقيًا. لكن تخيل: اليوم هو 1 مارس 2025، وعيد ميلاد المستخدم هو 5 مارس 2010. وفقًا لهذا المنطق، عمره 15 عامًا. بينما في الواقع عمره 14 عامًا. الخطأ هو أننا لم نأخذ في الاعتبار ما إذا كان عيد الميلاد قد مضى في العام الحالي أم لا.
\n\nالمصيدة الثانية هي السنوات الكبيسة. المولودون في 29 فبراير في سنة غير كبيسة يجب أن يحتفلوا في 28 فبراير أو 1 مارس. ويجب أن يتعامل كودك مع هذا بشكل صحيح.
\n\nالمشكلة الثالثة هي أن DateTime.Now يعتمد على المنطقة الزمنية للخادم. إذا كان خادمك يعمل بتوقيت UTC، والمستخدم ولد في موسكو، فقد يختلف الحساب عند حدود اليوم.
الخبر السار: كل هذه المشكلات قابلة للحل. وسنوضح لك كيف.
\n\nأفضل طريقة لحساب العمر في C# (حل مثبت)
\n\nبعد نقاشات طويلة على Stack Overflow والعديد من الاختبارات، توصل المجتمع إلى توافق. إليك أفضل ممارسة لحساب العمر في C# لعام 2025:
\n\npublic static int CalculateAge(DateTime birthDate, DateTime referenceDate)\n{\n // 1. حساب الفرق في السنوات\n int age = referenceDate.Year - birthDate.Year;\n\n // 2. التصحيح إذا لم يأتِ عيد الميلاد بعد في هذا العام\n if (referenceDate.Month < birthDate.Month || \n (referenceDate.Month == birthDate.Month && referenceDate.Day < birthDate.Day))\n {\n age--;\n }\n\n return age;\n}\n\n// الاستخدام مع التاريخ الحالي\nDateTime birthday = new DateTime(1990, 6, 15);\nint age = CalculateAge(birthday, DateTime.Today);\nConsole.WriteLine($"العمر: {age} سنة");\n\nلماذا يعمل هذا؟
\n- \n
- فرق السنوات — الحساب الأساسي. \n
- التصحيح — نتحقق مما إذا كان عيد الميلاد قد مضى في هذا العام. إذا لم يكن كذلك، نطرح سنة واحدة. \n
DateTime.Today— نستخدم تاريخ اليوم بالضبط بدلاً منDateTime.Nowلتجنب مشاكل الوقت من اليوم. \n
تعتبر هذه الطريقة قانونية. إنها بسيطة وواضحة وتغطي 99% من الحالات.
\n\nتقنيات متقدمة: Extension Methods ومعالجة الحالات الحدودية
\n\nإنشاء Extension Method مناسب
\n\nلكتابة نفس المنطق في كل مشروع، أضف طريقة تمديد لـ DateTime:
public static class DateTimeExtensions\n{\n public static int GetAge(this DateTime birthDate, DateTime? referenceDate = null)\n {\n var refDate = referenceDate ?? DateTime.Today;\n \n if (refDate < birthDate)\n throw new ArgumentException("تاريخ الميلاد لا يمكن أن يكون في المستقبل.");\n \n int age = refDate.Year - birthDate.Year;\n \n if (refDate.Month < birthDate.Month || \n (refDate.Month == birthDate.Month && refDate.Day < birthDate.Day))\n