ما هي أفضل طريقة التعامل مع التواريخ الطوابع الزمنية في جافا ؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

في كل مرة كنت بحاجة إلى العمل مع تاريخ و/أو timstamps في جافا أشعر دائما أنني أفعل شيئا خاطئا وقضاء ساعات طويلة في محاولة لإيجاد طريقة أفضل من العمل مع واجهات برمجة التطبيقات دون الحاجة إلى رمز بلدي التاريخ والوقت فائدة الطبقات.وهنا زوجين من الأشياء المزعجة قابلت للتو:

  • 0 القائم أشهر.وأنا أدرك أن أفضل الممارسات لاستخدام التقويم.أيلول / سبتمبر بدلا من 8, لكنه مزعج أن 8 يمثل سبتمبر وليس ديسمبر.

  • الحصول على موعد دون الزمني.أنا دائما في حاجة إلى الأداة التي الأصفار من الطابع الزمني جزء من التاريخ.

  • أنا أعلم أن هناك قضايا أخرى لقد كان في الماضي, ولكن لا يمكن أن نتذكر.لا تتردد في إضافة المزيد في ردودكم.

لذا سؤالي هو ...ماذا طرف ثالث واجهات برمجة التطبيقات التي تستخدمها لتبسيط جافا استخدام التاريخ والوقت التلاعب ؟ أية أفكار حول استخدام Joda?أي شخص بدا أقرب في JSR-310 التاريخ والوقت API ؟

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

المحلول

هذا المنصب وقد مناقشة جيدة مقارنة جافا التاريخ/الوقت API vs JODA.

أنا شخصيا فقط استخدام التقويم الغريغوري و SimpleDateFormat أي وقت كنت بحاجة إلى التعامل مع التواريخ والأوقات في جافا.لم يكن لدي أي مشاكل في استخدام API جافا و تجد أنه من السهل جدا أن استخدام حتى يكون حقا لا ينظر إلى أي بدائل.

نصائح أخرى

java.الوقت

جافا 8 وما بعدها يشمل الآن java.الوقت إطار.مستوحاة من Joda الوقت, تعريف JSR 310, مدد من قبل ThreeTen إضافية المشروع.انظر البرنامج التعليمي.

هذا الإطار supplants القديمة جافا.util.التاريخ/.التقويم الطبقات.تحويل طرق تمكنك من تحويل ذهابا وإيابا إلى العمل مع القانون القديم بعد تحديث جافا.وقت أنواع.

جوهر فصول هي:

  • Instant
    لحظة على الجدول الزمني ، دائما في UTC.
  • ZoneId
    منطقة زمنية.فرعية ZoneOffset ويشمل ثابت عن UTC.
  • ZonedDateTime = Instant + ZoneId
    يمثل لحظة على الجدول الزمني المعدل في منطقة زمنية معينة.

هذا الإطار يحل بعض المشاكل المذكورة.

0 القائم أشهر

الشهر الأرقام من 1 إلى 12 في جاوة.الوقت.

حتى أفضل ، Enum (Month) توفر مثيل كائن لكل شهر من شهور السنة.لذلك لا تحتاج إلى الاعتماد على "السحر" الأرقام في التعليمات البرمجية الخاصة بك مثل 9 أو 10.

if ( theMonth.equals ( Month.OCTOBER ) ) {  …

كما أن التعداد يشمل بعض مفيد فائدة أساليب مثل الحصول على شهر مترجمة الاسم.

إذا لم تكن مألوفة مع جافا enums, قراءة البرنامج التعليمي و دراسة.هم من المستغرب مفيد وقوي.

التاريخ بدون وقت

على LocalDate تمثل الفئة a التاريخ قيمة ، دون الوقت من اليوم ، دون المنطقة الزمنية.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

علما بأن تحديد موعد يتطلب وقتا المنطقة.يوم جديد يشرق في وقت سابق في باريس في مونتريال حيث لا يزال 'أمس'.على ZoneId تمثل الطبقة منطقة زمنية.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

وبالمثل ، هناك LocalTime الطبقة لبعض الوقت من اليوم بعد تعادل تاريخ أو المنطقة الزمنية.


حول جافا.الوقت

على java.الوقت إطار بنيت في جاوة 8 وما بعدها.هذه الفئات محل مزعجة القديمة تراث التاريخ الوقت الطبقات مثل java.util.Date, Calendar, & SimpleDateFormat.

على Joda الوقت المشروع الآن في وضع الصيانة, تنصح الهجرة إلى java.الوقت فصول.

لمعرفة المزيد ، راجع أوراكل التعليمي.والبحث تجاوز سعة مكدس على العديد من الأمثلة و الشروح.مواصفات JSR 310.

أين يمكن الحصول على جافا.الوقت الطبقات ؟

على ThreeTen إضافية المشروع يمتد جافا.الوقت مع فصول إضافية.هذا المشروع هو إثبات أن من الممكن في المستقبل الإضافات جافا.الوقت.قد تجد بعض المعلومات المفيدة في هذه الطبقات هنا مثل Interval, YearWeek, YearQuarter, ، المزيد.

أباتشي العموم Lang المشروع DateUtils الدرجة التي تنفذ مفيدة تاريخ العمليات.

يمكنني استخدام DateUtils.truncate() الكثير الذي سوف "صفر" أجزاء من تاريخ بالنسبة لك (مفيدة إذا كنت تريد الخاص بك التاريخ كائن إلى تمثل تاريخ و لا تتضمن أي معلومات في الوقت).كل أسلوب يعمل على حد سواء Date و Calendar الكائنات أيضا.

http://commons.apache.org/lang/

لقد تم استخدام Joda حصريا لمدة ثلاث سنوات الآن و بالتأكيد أوصى به - بل كل منطقة مغطاة واجهة 'مكتوب'.

Joda يمكن أن تبدو معقدة عندما تبدأ ، وعلى سبيل المثال فقد مفاهيم فترات ومدة فترات التي تبدو نوعا من المشابهة ، ولكن يمكنك أن تبدأ ببساطة عن طريق استبدال org.joda.time.DateTime (أو org.joda.time.DateMidnight) بالنسبة java.util.Date في التعليمات البرمجية الخاصة بك ، والعالقة مع العديد من الأساليب المفيدة أن هذه الطبقات تحتوي على, قبل فهم المجالات الأخرى.

Im باستخدام GregorianCalendar - دائما وفي كل مكان.بسيطة جافا.util.تاريخ معقد جدا ، نعم.

لذا نصيحتي هي استخدام GC, بسيطة

انه نفس الشيء في جافا سكريبت.شخص ما يجب أن التدخين شيء عندما تعتقد انها فكرة جيدة للسماح 2008 يعني العام 2008 ، 31 يعني 31 يوما في الشهر - وهذا هو أفضل جزء - 11 يعني 12 شهر.

من ناحية أخرى, أنها حصلت على اثنين من أصل ثلاثة.

الشيء الذي دائما يحصل لي مع جافا هو تاريخ مكتبة وقت.أنا لم تستخدم Joda باختصار ننظر في الأمر ، تبدو جيدة التنفيذ ، وإذا فهمت JSR-130 بشكل صحيح مع المعرفة من Joda و في نهاية المطاف وبعد ذلك تدرج في JavaSE.

في كثير من الأحيان عن المشاريع السابقة لقد ملفوفة جافا التاريخ الوقت الكائنات التي في حد ذاتها مهمة جدا.ثم تستخدم الأغلفة تاريخ التلاعب.

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

الكثير من المبرمجين البدء باستخدام التاريخ ، التي لديها العديد من إهمال طاقتها منشئات (مما يجعل من الصعب استخدام), ولكن بمجرد معرفة GregorianCalendar يصبح قليلا أسهل لإدارة.المثال هنا هو مفيدة جدا:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html

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

  1. تاريخ (أيالسنة-الشهر-اليوم)
  2. لحظة (أيوإذا ما اتخذت)

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

بالنسبة لي Joda هو أكثر تعقيدا ، على الأقل بالنسبة للأغلبية الساحقة من أغراض خاصة لا أحب حقيقة أنها قد ذهبت ضد جافا القياسية أشكال ، منها على سبيل المثال كيفية تحليل و تنسيق التواريخ.ستيفن Colebourne الرجل وراء JODA هي المواصفات الرصاص من JSR-310 و هذا يعاني من نفس المشاكل imho (لقد تابعت وساهم في المناقشات خلال السنوات القليلة الماضية).

تفعل ذلك بنفسك ؛ فإنه من السهل.مجرد ملء في الفئات التالية:MyDate (التفاف سنة-شهر-يوم) في الشهر (وهي enum), TimeOfDay (ساعة-دقيقة-ثانية-ميليس), DayOfWeek (enum) الفورية (التفاف طويل).دائما النظر في المناطق الزمنية عند تحويل بين اللحظات والتواريخ.

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

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