كيف يمكنك برمجياً إنشاء نمط من تاريخ مخزّن في سلسلة؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي سلسلة تحتوي على تمثيل التاريخ.يبدو مثل:

الخميس 30 نوفمبر 19:00:00 بتوقيت شرق الولايات المتحدة 2006

أحاول إنشاء كائن تاريخ باستخدام SimpleDateFormat ولدي مشكلتان.

1.) لا يمكنني اكتشاف النمط لترميز الحل في مُنشئ SimpleDateFormat

2.) لا يمكنني العثور على طريقة يمكنني من خلالها تحليل السلسلة باستخدام واجهة برمجة التطبيقات (API) لتحديد النمط حتى أتمكن من إعادة استخدام هذا لأنماط مختلفة من إخراج التاريخ

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

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

المحلول

يمكن البحث عن التنسيق الذي سيتم تمريره إلى SimpleDateFormat http://java.sun.com/javase/6/docs/api/Java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

أما بالنسبة لسؤالك الثاني، فلا أعرف أي مكتبة Java لمعرفة تنسيق التاريخ وتحليله دون معرفة ما هو التنسيق مسبقًا.

نصائح أخرى

محلل تاريخ POJava org.pojava.datetime.DateTime هو محلل قوي وثابت يدعم لغات ومناطق زمنية وتنسيقات متعددة.

وأفضل ما في الأمر هو أن المحلل اللغوي هو إرشادي ولا يتطلب "تنسيقًا" موجودًا مسبقًا للعمل.ما عليك سوى تمرير سلسلة نصية للتاريخ/التاريخ والوقت والحصول على java.util.Date!

لست متأكدًا من وجود أي طريقة سهلة لتحليل التاريخ وتحديد نمطه، لكنني كنت أعتقد أن نمط النموذج الذي نشرته سيكون:

EEE MMM dd HH:mm:ss zzz yyyy

إذا كنت تريد القيام بأي شيء آخر غير تحليل التاريخ أو تنسيقه، فلا يوجد الكثير للتعامل مع الأنماط نفسها.منذ بعض الوقت كنت أكتب مكون Swing لإدخال التواريخ في حقل نص منسق.لقد قمت بتوفير نمط وقام بتحريك مؤشر إدخال النص عبر عناصر هذا النمط، مع السماح فقط بالقيم الصالحة.

وكجزء من ذلك كتبت ملف DateFormatParser متاح هنا كجزء من مشروع OpenHarmonise مفتوح المصدر.

سيكون تحليل تاريخ إلى نمط مشكلة مثيرة للاهتمام للغاية يجب معالجتها.سيكون عليك وضع افتراضات معينة (على سبيل المثال.استخدام :في الوقت المناسب وليس التاريخ) ولكنك ستواجه المشاكل الأبدية المتمثلة في السنوات المكونة من رقمين وترتيبات اليوم/الشهر أو الشهر/اليوم.

من الجدير معرفة أن تنسيق التاريخ الذي قدمته ليس تنسيقًا عشوائيًا.إنه ناتج طريقة Date.toString() المضمنة (على الأقل في لغات المملكة المتحدة والولايات المتحدة).ليس من قبيل الصدفة، فهو أيضًا تنسيق أمر Unix 'date' (على الأقل في Linux، وأنا أؤمن بالتطبيقات الأخرى أيضًا) - على الرغم من كونه متحذلقًا، فإن Date.toString() يقوم بتضمين أرقام الأيام المكونة من رقم واحد مع صفر بينما تاريخ يونكس لا.

ما يعنيه هذا هو أنه من المحتمل أن تتلقى تنسيق الإدخال هذا عندما تقوم بإخراج تاريخ غير منسق في حقل قابل للتعديل بواسطة المستخدم (على سبيل المثال.حقل HTML INPUT) واستلامه مرة أخرى بدون تعديل.لذا فإن مجرد إدخال الإدخال بهذا التنسيق، لا يعني أن المستخدمين سيكتبون آلاف التنسيقات العشوائية الأخرى.

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

انظر أباتشي كومنز DateUtils.هناك parseDate الطريقة التي تأخذ الخاص بك String وأنماط متعددة لمحاولة البصق Date مثال.

وكما قال آخرون، يبدو النمط كما ينبغي أن يكون

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

أما بالنسبة لتحليل تاريخ التنسيق التعسفي، فأنا لست على علم بأي مكتبة تقوم بذلك في Java.إذا كنت حريصًا على تطوير شيء كهذا، فسأبدأ بالنظر إلى لغة Perl str2time وظيفة.

يجب أن أقول إنني أجد السؤال الآخر مثيرًا للاهتمام للغاية.هناك مشكلة خطيرة واحدة رغم ذلك - قم بتحليل هذا:08/07/06!إذا قمت بتقييد نفسك بمجموعة فرعية من التنسيقات المتوقعة، فمن المحتمل أن تتمكن من حل المشكلة من خلال اللعب باستخدام التعبيرات العادية، ويمكنك بناء مجموعة من الأنماط المتوقعة، ثم كسر السلاسل على مسافات أو أي شيء آخر، ومطابقة جزء بجزء.

هل تسأل فقط عن النمط لذلك التاريخ المحدد؟إذا كان الأمر كذلك، أعتقد أن هذا يجب أن يفعل ذلك:

"EEE MMM d HH:mm:ss z yyyy"

أم أنك تحاول أخذ أي تاريخ منسق واستنتاج التنسيق وتحليله؟

ماذا عن:

EEE MMM dd HH:mm:ss zzz yyyy

ما عليك سوى تمرير السلسلة إلى مُنشئ SimpleDateFormat.لاستخدام الكائن، ما عليك سوى استدعاء الأسلوب parse لتمرير السلسلة التي تريد تحويلها إلى تاريخ.

يمكنك إلقاء نظرة على:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

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

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

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