السنوات المكونة من رقمين باستخدام strptime() غير قادرة على تحليل أعياد الميلاد جيدًا

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

  •  17-09-2020
  •  | 
  •  

سؤال

ضع في اعتبارك أعياد الميلاد التالية (مثل dob):

  • 1-يونيو-68
  • 1-يونيو-69

عندما يتم تحليلها مع بايثون datetime.strptime(dob, '%d-%b-%y') سوف تسفر:

  • datetime.datetime(2068, 6, 1, 0, 0)
  • datetime.datetime(1969, 6, 1, 0, 0)

حسنًا، بالطبع من المفترض أن يولدوا في نفس العقد ولكن الآن ليس حتى في نفس القرن!

بحسب ال مستندات هذا سلوك صحيح تمامًا:

عند قبول سنوات من رقمين ، يتم تحويلها وفقًا لـ POSIX أو X/Open Standard:يتم تعيين القيم 69-99 إلى 1969-1999 ، ويتم تعيين القيم 0-68 إلى 2000-2068.

أفهم سبب إعداد الوظيفة على هذا النحو ولكن هل هناك طريقة للتغلب على هذه المشكلة؟ربما مع تحديد النطاقات الخاصة بك لسنوات مكونة من رقمين؟

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

المحلول

إذا كنت تستخدمه دائمًا لأعياد الميلاد، فما عليك سوى طرح 100 إذا كان العام بعد الآن:

if d > datetime.now():
    d = datetime(d.year - 100, d.month, d.day)

نصائح أخرى

تنقل هذه الوظيفة العام إلى عام 1950:

def millenium(year, shift=1950):
    return (year-shift)%100 + shift

إذا كنت تتوقع عيد ميلاد، فيمكنك دائمًا تدليك البيانات يدويًا - أي تاريخ في المستقبل يتم إرجاعه تلقائيًا إلى قرن من الزمان، أو ما شابه ذلك.

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