كيفية تحليل السنة المكونة من أربعة أرقام فقط (باستخدام Joda Time)؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لإجبار وقت Joda على تحليل التواريخ فقط عندما تحتوي على أربع أرقام من السنوات؟على سبيل المثال:

  • 11/11/2009 - يجب التحليل
  • 11-09-11 - لا ينبغي التحليل

جربت الكود التالي:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

يوزع إلى 0009-11-11.يبدو أن minDigits في طريقة appendYear تُستخدم فقط للتنسيق عند طباعة التاريخ.
والنتيجة هي نفسها إذا استخدمت appendYearOfEra().إذا استخدمت appendYearOfCentury()‎، فستقوم بتوزيع السنة إلى 1909 بدلاً من ذلك.

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

بعض الأمثلة الحقيقية يمكن أن تبدو كما يلي:

  • 2009-11-11
  • الأربعاء2009-11-11T15:00:00
  • 2009/11/11 15:00
  • و أكثر من ذلك بكثير...
هل كانت مفيدة؟

المحلول

قد يقوم DateTimeFormatterBuilder.appendFixedDecimal()‎ بما تحتاجه.

وبدلاً من ذلك، يمكنك تنفيذ واجهة DateTimeParser لإنشاء أي محلل تريده وتمريره إلى DateTimeFormatterBuilder.

نصائح أخرى

يمكنك التحقق من طول سلسلة التاريخ.

يمكنك إنشاء محللين ومنسقين محددين للغاية باستخدام DateTimeFormatterBuilder.ليست هناك حاجة عمومًا لاستخدام هذه الفئة مباشرةً، نظرًا لأن معظم التنسيقات الشائعة متاحة بسهولة أكبر في أي مكان آخر في واجهة برمجة التطبيقات، ولكن هذه هي فئة الإنشاء التي يستخدمونها جميعًا تحت الأغطية.

ما الذي تريد الحصول عليه من المستخدم الذي يقوم بإدخال "0001-01-01" كتاريخ (أي أنه أدخل 4 أرقام للسنة، ولكن الثلاثة الأولى كانت أصفارًا)؟ماذا عن "0999-12-31"؟و"999-12-31"؟وماذا عن "10000-01-01" - سيئ السمعة Y10K1 مشكلة؟

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

  • إذا لم تكن هذه قيمة شرعية، فأنت عالق في التحقق من قيمة السنة بعد تحليل التاريخ.

  • أو يمكنك أخذ الكود وتعديله بحيث يتضمن التعريف المفضل لديك للسنة الصالحة.


1 لا أخطط لبدء العمل على إصلاح مشكلة Y10K قبل 02-01-5000.

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